![]() |
Datenbank: dbase • Zugriff über: BDE
Problem mit mehrfachen JOIN
Hi NG.
Ich möchte per localSQL eine Abfrage über vier Tabellen tab1, tab2, tab3 und tab4 erstellen. Die Beziehungen der Tabellen untereinander sind wie folgt:
Delphi-Quellcode:
Das Query soll alle Sätze aus tab1 anzeigen.
tab4 <- tab1 -> tab2 -> tab3
mit -> := OUTER JOIN Bisher schaut meine Abfrage so aus:
SQL-Code:
Als Ergebnis erhalte ich hierbei mehr Sätze als erwartet.
SELECT tab1.FeldA, tab2.FeldB, tab3.FeldC, tab4.FeldD
FROM tab1 LEFT OUTER JOIN tab2 ON (tab1.Feld1=tab2.Feld1) AND (tab1.Feld2=tab2.Feld2) LEFT OUTER JOIN tab3 ON (tab2.Feld3=tab3.Feld3) LEFT OUTER JOIN tab4 ON (tab1.Feld4=tab4.Feld4) WHERE (tab2.Feld5 IS NULL OR tab2.Feld5=100) OR tab3.Feld7 IS NULL AND (tab4.Feld6 IS NULL OR tab4.Feld6=100) Lasse ich im SQL-Text die JOIN-Zeile von tab4 weg, so erhalte ich die korrekte Anzahl an Sätzen. Kann mir jemand einen Tipp geben was ich falsch mache? Gruß Peter |
Re: Problem mit mehrfachen JOIN
Hi,
mir ist aufgefallen, dass du noch zwei Klammern vergessen hast.
SQL-Code:
Bin mir aber nicht sicher ob es das Problem löst................... :oops:
SELECT tab1.FeldA, tab2.FeldB, tab3.FeldC, tab4.FeldD
FROM tab1 LEFT OUTER JOIN tab2 ON ((tab1.Feld1=tab2.Feld1) AND (tab1.Feld2=tab2.Feld2)) LEFT OUTER JOIN tab3 ON (tab2.Feld3=tab3.Feld3) LEFT OUTER JOIN tab4 ON (tab1.Feld4=tab4.Feld4) WHERE (tab2.Feld5 IS NULL OR tab2.Feld5=100) OR tab3.Feld7 IS NULL AND (tab4.Feld6 IS NULL OR tab4.Feld6=100) Grüße.................. :dance: |
Re: Problem mit mehrfachen JOIN
Leider löst das das Problem auch nicht.
Es zeigt sich über keine Veränderung mit oder ohne diesen Klammern. |
Re: Problem mit mehrfachen JOIN
Muss das nicht vllt. so aussehen:
SQL-Code:
Das Problem iss dass ich fast aussließlich unter ORACLE programmiere. Zwar ab und zu auch unter MSSQl oder DB2(gleiche schreibweise wie in deinem Beispiel) aber da verzweifel ich auch immer an den Outer joins............und frag dann immer lieber nen Arbeitskollegen und lass ihn drüber gucken............
SELECT tab1.FeldA, tab2.FeldB, tab3.FeldC, tab4.FeldD
FROM tab1 LEFT OUTER JOIN tab2 ON ((tab1.Feld1=tab2.Feld1) AND (tab1.Feld2=tab2.Feld2)), tab2 LEFT OUTER JOIN tab3 ON (tab2.Feld3=tab3.Feld3), tab1 LEFT OUTER JOIN tab4 ON (tab1.Feld4=tab4.Feld4) WHERE (tab2.Feld5 IS NULL OR tab2.Feld5=100) OR tab3.Feld7 IS NULL AND (tab4.Feld6 IS NULL OR tab4.Feld6=100) Güße............ |
Re: Problem mit mehrfachen JOIN
Mir fällt gerade etwas noch seltsameres auf.
Wenn ich alle vier Tabellen mit JOIN verknüpfe wie beschrieben, so werden mir Nonsens-Daten angezeigt. Irgendwie sind die dargestellten Werte verrutscht. Mit verrutscht meine ich, dass die in den einzelnen Ausgabefeldern Daten aus mehreren Feldern zusammen angezeigt werden und diese z.T. noch verstümmelt. Ganz seltsam! Entferne ich aus der Abfrage tab4, so wird alles korrekt ausgeführt und dargestellt - wie bereits erwähnt. |
Re: Problem mit mehrfachen JOIN
@zwaem86
Das sieht auch recht sympatisch aus ;), aber es bringt Borlands DBoberfläche zum Absturz. Aber ich glaube auch nicht, dass deine Variante nötig ist, da es ja auch so nur mit den drei tab1..3 klappt. |
Re: Problem mit mehrfachen JOIN
Hallo Peter,
deine WHERE Klausel sieht mir nicht ganz koscher aus. Ich würde eine AND Verknüpfung an der bezeichneten Stelle erwarten:
SQL-Code:
Grüße vom marabu
SELECT tab1.FeldA, tab2.FeldB, tab3.FeldC, tab4.FeldD
FROM tab4 RIGHT OUTER JOIN tab1 ON tab1.Feld4 = tab4.Feld4 LEFT OUTER JOIN tab2 ON tab1.Feld1 = tab2.Feld1 AND tab1.Feld2 = tab2.Feld2 LEFT OUTER JOIN tab3 ON tab2.Feld3 = tab3.Feld3 WHERE (tab4.Feld6 IS NULL OR tab4.Feld6=100) AND (tab2.Feld5 IS NULL OR tab2.Feld5=100) AND tab3.Feld7 IS NULL /* AND statt OR ? */ |
Re: Problem mit mehrfachen JOIN
Zitat:
Schonmal ohne Where-Klausel probiert? |
Re: Problem mit mehrfachen JOIN
Nein, das tab2 muss schon sein. Die Beziehung ist ja "tab2->tab3" und nicht "tab1->tab3". Bitte nicht verwechseln mit dem mathematischen Folgerungsschluss "A->B und B->C dann auch A->C".
Wenn ich die WHERE-Klausel weglasse, werden mir nicht alle Sätze von tab1 angezeigt. Das muss schon so sein. |
Re: Problem mit mehrfachen JOIN
Hallo Peter,
wie ist deine Antwort auf die Frage AND statt OR aus Beitrag #7? Freundliche Grüße marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 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