![]() |
Datenbank: XXX • Version: XXX • Zugriff über: SQL
Mehrere SQL Join-Anweisungen in einem Statement
HI DP´ler
Folgende Problematik beschäftigt mich: Ich habe eine Tabelle (AGF_KBU) in der verschiedenste Spalten mit Nummern stehen (z.B: Periode_Nr, Abrechnungs_Nr, Laufende_Nr usw...). Die jeweiligen Bezeichnungen der Spalten(Periode_Bezeichnung, Abrechnungs_Bezeichnung, usw..) stehen aber jeweils in extra Tabellen. Mein Problem ist das ich nich tweis wie ich sämtliche INNER JOINS in ein SQL-Statement bekomm. Hab es nun Beispielhaft für eine Verknüpfung gemacht:
Delphi-Quellcode:
(in der Tabelle agf_kbu steht die Perioden_Nr, in agf_per die Bezeichnung der entsprechenden Nr)
Select t2.per_zeitraum from (agf_kbu t1 inner join agf_per t2 on t1.KBU_Periode = t2.PER_Periode)
Die große Frage ist nun wie ich ca. 15 bis 20 solcher SQL-Abfragen in einer Einzigen verbinden kann. Mir fällt im moment garnix mehr ein^^ |
AW: Mehrere SQL Join-Anweisungen in einem Statement
Einfach hintereinander schreiben.
SQL-Code:
SELECT * FROM Tab1
JOIN Tab2 ON Bedingung JOIN Tab3 ON Bedingung JOIN Tab4 ON Bedingung --usw. usf. |
AW: Mehrere SQL Join-Anweisungen in einem Statement
oder etwas klassischer:
SQL-Code:
SELECT * FROM Tab1, Tab2, Tab3, TabX
WHERE Tab1.Spalte1 = Tab2.Spalte AND Tab1.Spalte2 = Tab3.Spalte AND Tab1.Spalte3 = TabX.Spalte |
AW: Mehrere SQL Join-Anweisungen in einem Statement
Da werden Outer Joins aber schwieriger, AFAIK gehört das (+) nicht zum SQL-Standard.
|
AW: Mehrere SQL Join-Anweisungen in einem Statement
Beides funktioniert ganz wunderprächtig, könnt ihr mir noch sagen wo ich den left join ansetzen muss das mir von meiner grund tabelle agf_kbu ALLE Daten angezeigt werden? Auch die, die nicht den JOIN-Bedingungen entsprechen.
Edit: Über all LEFT vorhängen habs schon raus^^ |
AW: Mehrere SQL Join-Anweisungen in einem Statement
Ein (INNER) JOIN liefert nur die Daten mit Entsprechungen, ein LEFT/RIGHT (OUTER) JOIN liefert alle Daten, wobei dann die nicht vorhandenen Entsprechungen NULL-Werte liefern. Da ich Deine DB-Struktur nicht kenne, kannst Du mal testhalber alle JOINs in LEFT JOINs ändern. Anschließend musst Du selbst entscheiden, wo Du nur Entsprechungen haben willst.
|
AW: Mehrere SQL Join-Anweisungen in einem Statement
Hab aus den JOIN´s lauter LEFT JOIN´s gemacht und seh quasi nun auch alle leeren Felder aber das ist durchaus gewünscht so.^^
|
AW: Mehrere SQL Join-Anweisungen in einem Statement
Dann ist ja alles paletti :)
|
AW: Mehrere SQL Join-Anweisungen in einem Statement
Zitat:
Tab1.idFld*= Tab2.idFld -- MS Tab1.idFld(+)= Tab2.idFld -- Oracle Was Kommentare angeht, gibt es ja auch unterschiedliche Ansätze. Gruß K-H |
AW: Mehrere SQL Join-Anweisungen in einem Statement
Dann doch lieber die JOIN-Syntax, damit können alle mir bekannten DBMS umgehen.
|
AW: Mehrere SQL Join-Anweisungen in einem Statement
Zitat:
OT on Die klassische Art ist meiner Meinung nach besser lesbar OT off Gruss KHH |
AW: Mehrere SQL Join-Anweisungen in einem Statement
Zitat:
@DeddyH Vielleicht heute, vor ein paar Jahren war das nicht so, darum bin ich immer noch "klassiker" Gruß K-H |
AW: Mehrere SQL Join-Anweisungen in einem Statement
Moin Moin
Hab grad die beiden Methoden nochmal getestet und bin auf folgendes Problem gestoßen. Wenn ich in dem SELECT * FROM table1, table2, usw... bestimmte Tabellen aus meiner DB in die FROM Angabe schreibe erhält meine Ergebnismenge jeden Datensatz immer mehrmals und ich habe keine Ahnung wie das zu stande kommt. Hier noch ma der Bsp-Code:
Code:
Ohne die t5 funktionierts einwandfrei, sobald ich diese hinzufüge nicht mehr (und das is mit einigen Spalten so)
SELECT * FROM AGF_KBU t1, AGF_PER t2, AGF_BUKR t3, AGF_KSTK t4, AGF_SAK t5
WHERE t1.KBU_Periode = t2.PER_Periode AND t1.KBU_Bukr_Nummer = t3.BUKR_Nummer Ist ADS da irgendwie beschränkt oder müssen die Properties der Tables gewissen Vorraussetzungen erfüllen? (Waren jetzt meine ersten Ideen) mfg |
AW: Mehrere SQL Join-Anweisungen in einem Statement
Du hast ja auch nicht definiert, wie die Tabelle 5 in Beziehung zu den anderen steht, somit erhältst Du das kartesische Produkt der Datensätze dieser Tabelle zu denen des JOINs.
|
AW: Mehrere SQL Join-Anweisungen in einem Statement
Hm ok aber das hab ich bei Tabelle 4 ja auch nicht getan und mit der gehts ganz normal, daher wunderts mich
|
AW: Mehrere SQL Join-Anweisungen in einem Statement
Vielleicht gibt es nur einen Datensatz in Tabelle 4?
|
AW: Mehrere SQL Join-Anweisungen in einem Statement
Nope, da sind einige drin.
Jetzt bekomm ich noch nen Invalid Operator Fehler bei meinem Code:
Code:
Ach ja wenn ich die JOIN-Syntax verwende funktioniert es besser als so^^
SELECT kbu_key, kbu_sts, sts_bezeichnung FROM AGF_KBU t1, AGF_PER t2, AGF_BUKR t3, AGF_STS t4
WHERE t1.KBU_Periode = t2.PER_Periode AND t1.KBU_Bukr_Nummer = t3.BUKR_Nummer AND t1.KBU_STS = t4.STS_Bezeichnung |
AW: Mehrere SQL Join-Anweisungen in einem Statement
Sind die Feldbezeichner eindeutig? Ansonsten schreib einmal den Alias davor (in der SELECT-Klausel).
|
AW: Mehrere SQL Join-Anweisungen in einem Statement
Hm ne daran liegts wohl auch ned, hm kp, ich werds nu mit der JOIN Syntax umsetzen da klappts wesentlich besser
|
AW: Mehrere SQL Join-Anweisungen in einem Statement
So hab das ganze nu auf JOIN-Syntax umgemünzt nur leider im Endeffekt das selbe Problem (war ja eigentlich auch zu erwarten)
Code:
selbst wenn ich alles mit Alias versehe ensteht durch die LETZTE ZEILE der Effekt das alle Datensätze 7 mal vorkommen...
SELECT t1.kbu_key, t2.per_zeitraum, t3.bukr_bez, t4.sts_bezeichnung, t5.sak_kbez, t6.kst_kbez, t7.bis_langtext FROM AGF_KBU t1
LEFT JOIN AGF_PER t2 ON t1.KBU_Periode = t2.PER_Periode LEFT JOIN AGF_BUKR t3 ON t1.KBU_Bukr_Nummer = t3.BUKR_Nummer LEFT JOIN AGF_STS t4 ON t1.KBU_Sts = t4.STS_Schluessel LEFT JOIN AGF_SAK t5 ON t1.KBU_Konto = t5.SAK_Konto LEFT JOIN AGF_KSTK t6 ON t1.KBU_Kost1 = t6.KST_Kostenstelle LEFT JOIN AGFA_BIS t7 ON t5.SAK_iBilanzrelevant = t7.BIS_Zeile |
AW: Mehrere SQL Join-Anweisungen in einem Statement
Das sieht danach aus als gäbe es in T7 7 (zu dieser Einschränkung passende) Datensätze zu jedem T5 Datensatz.
D.h. ggf. solltest du den letzten JOIN etwas weiter einschränken. |
AW: Mehrere SQL Join-Anweisungen in einem Statement
Hm hab alle JOIN-Varianten ausprobiert, keine Änderung. Ich dachte mir es hängt vielleicht damit zusammen das ich FROM AGF_KBU oben mache und unten im letzten JOIN mich aber nicht mehr auf die AGF_KBU Tabelle beziehe in der ON Anweisung. Kann das damit zusammenhängen das dadurch die BEziehung nicht ganz korrekt ist?
|
AW: Mehrere SQL Join-Anweisungen in einem Statement
Was sollen wir Dir denn sagen, wenn wir die Tabellenstruktur nicht kennen? :glaskugel:
|
AW: Mehrere SQL Join-Anweisungen in einem Statement
Zitat:
Da es sich bei Deinem Beispiel im weitesten Sinne um Buchhaltungsdaten handelt könnten z.B. zu einer Rechnungsnummer mehrere Buchungsdatensätze - für jeden Rechnungsposten einer - vorhanden sein. Geh doch bitte einmal in Dich und versuch Dein Problem noch einmal genau zu schildern. Du mußt ja nicht die Orginal-Feldbezeichner verwenden. Gruß K-H |
AW: Mehrere SQL Join-Anweisungen in einem Statement
Ja ich weis das war sehr schwammig formuliert, da war ich wohl sehr im Stress sry...
Mittlerweile habe ich das Problem auch schon gelöst, aber das Problem an der Sache war das die Tabellen aus dehnen ich meine Datensätze bekomme, alle ADS Freetables sind und diesen können keinerlei Fremdschlüssel, Beziehungen oder Referentielle Integritäten zwischen Tabellen zugewiesen werden. Somit existieren hierbei Tabellen die komplett unabhängig von einander sind, was es mir nicht ermöglicht hat eine funktionierende Filterbedingung in meine SELECT-Anweisung einzubauen. Ich hoffe das Problem ist so ein wenig klarer geschildert. Gelöst hab ich das Problem durch das Einsetzen mehrerer SQL-Querys die durch einen, dafür programmierten, SQL-Statement-Builder zusammengefügt werden und dann ein eigenes SQL-Statement gebaut wird welches die gewünschte Zielfunktion perfekt ausführt;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz