Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Mehrere SQL Join-Anweisungen in einem Statement (https://www.delphipraxis.net/155397-mehrere-sql-join-anweisungen-einem-statement.html)

Ascuriah 21. Okt 2010 14:57

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:
Select t2.per_zeitraum from (agf_kbu t1 inner join agf_per t2 on t1.KBU_Periode = t2.PER_Periode)
(in der Tabelle agf_kbu steht die Perioden_Nr, in agf_per die Bezeichnung der entsprechenden Nr)

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^^

DeddyH 21. Okt 2010 15:02

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.

gmc616 21. Okt 2010 15:27

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

DeddyH 21. Okt 2010 15:29

AW: Mehrere SQL Join-Anweisungen in einem Statement
 
Da werden Outer Joins aber schwieriger, AFAIK gehört das (+) nicht zum SQL-Standard.

Ascuriah 21. Okt 2010 15:53

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^^

DeddyH 21. Okt 2010 15:56

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.

Ascuriah 21. Okt 2010 16:24

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.^^

DeddyH 21. Okt 2010 16:28

AW: Mehrere SQL Join-Anweisungen in einem Statement
 
Dann ist ja alles paletti :)

p80286 21. Okt 2010 16:45

AW: Mehrere SQL Join-Anweisungen in einem Statement
 
Zitat:

Zitat von DeddyH (Beitrag 1056955)
Da werden Outer Joins aber schwieriger, AFAIK gehört das (+) nicht zum SQL-Standard.

Da, was den Standard angeht, jeder Hersteller sehr individuelle Vorstellungen hat, empfehle ich hier Hanbuchstudium. Zumindestens MS und Oracle bieten hier so etwas:

Tab1.idFld*= Tab2.idFld -- MS
Tab1.idFld(+)= Tab2.idFld -- Oracle

Was Kommentare angeht, gibt es ja auch unterschiedliche Ansätze.

Gruß
K-H

DeddyH 21. Okt 2010 16:53

AW: Mehrere SQL Join-Anweisungen in einem Statement
 
Dann doch lieber die JOIN-Syntax, damit können alle mir bekannten DBMS umgehen.

khh 21. Okt 2010 16:55

AW: Mehrere SQL Join-Anweisungen in einem Statement
 
Zitat:

Zitat von gmc616 (Beitrag 1056953)
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

möcht ich grad mal meine Senf dazu geben ;-)
OT on
Die klassische Art ist meiner Meinung nach besser lesbar
OT off


Gruss KHH

p80286 21. Okt 2010 17:03

AW: Mehrere SQL Join-Anweisungen in einem Statement
 
Zitat:

Zitat von khh (Beitrag 1056982)
Zitat:

Zitat von gmc616 (Beitrag 1056953)
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

möcht ich grad mal meine Senf dazu geben ;-)
OT on
Die klassische Art ist meiner Meinung nach besser lesbar
OT off


Gruss KHH

Ist wohl Geschmackssache, obwohl ich hier schon Beispiele gesehen habe, die auch ordentlich aussahen.

@DeddyH
Vielleicht heute, vor ein paar Jahren war das nicht so, darum bin ich immer noch "klassiker"

Gruß
K-H

Ascuriah 25. Okt 2010 09:54

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:
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
Ohne die t5 funktionierts einwandfrei, sobald ich diese hinzufüge nicht mehr (und das is mit einigen Spalten so)
Ist ADS da irgendwie beschränkt oder müssen die Properties der Tables gewissen Vorraussetzungen erfüllen? (Waren jetzt meine ersten Ideen)

mfg

DeddyH 25. Okt 2010 09:59

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.

Ascuriah 25. Okt 2010 10:05

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

DeddyH 25. Okt 2010 10:11

AW: Mehrere SQL Join-Anweisungen in einem Statement
 
Vielleicht gibt es nur einen Datensatz in Tabelle 4?

Ascuriah 25. Okt 2010 10:16

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:
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
Ach ja wenn ich die JOIN-Syntax verwende funktioniert es besser als so^^

DeddyH 25. Okt 2010 10:18

AW: Mehrere SQL Join-Anweisungen in einem Statement
 
Sind die Feldbezeichner eindeutig? Ansonsten schreib einmal den Alias davor (in der SELECT-Klausel).

Ascuriah 25. Okt 2010 10:34

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

Ascuriah 25. Okt 2010 10:47

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:
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
selbst wenn ich alles mit Alias versehe ensteht durch die LETZTE ZEILE der Effekt das alle Datensätze 7 mal vorkommen...

Neutral General 25. Okt 2010 10:51

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.

Ascuriah 25. Okt 2010 10:59

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?

DeddyH 25. Okt 2010 11:11

AW: Mehrere SQL Join-Anweisungen in einem Statement
 
Was sollen wir Dir denn sagen, wenn wir die Tabellenstruktur nicht kennen? :glaskugel:

p80286 25. Okt 2010 14:11

AW: Mehrere SQL Join-Anweisungen in einem Statement
 
Zitat:

Zitat von Ascuriah (Beitrag 1057637)
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?

Entschuldige, das sieht mir wie ein herumgestochere im Nebel aus. So wie in Deinen Beispielen mal 5 und mal 7 Tabellen auftauchen, und mal Ansi und mal "klassische" Joins verwendet werden, sieht mir das sehr unstrukturiert aus. Jede der Tabellen, die Du verwendest, sollte eigentlich einem Zweck dienen. Informationen zu einem (Fremd)Schlüssel speichern. Und wenn es möglich ist, daß zu einem (Fremd)Schlüssel mehrere Informationen vorliegen, dann können auch mehrere Ausgabesätze generiert werden.

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

Ascuriah 25. Okt 2010 16:29

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