Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit mehrfachen JOIN (https://www.delphipraxis.net/73047-problem-mit-mehrfachen-join.html)

PASST 11. Jul 2006 15:05

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:
tab4 <- tab1 -> tab2 -> tab3
mit -> := OUTER JOIN
Das Query soll alle Sätze aus tab1 anzeigen.
Bisher schaut meine Abfrage so aus:
SQL-Code:
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)
Als Ergebnis erhalte ich hierbei mehr Sätze als erwartet.

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

zwaem86 11. Jul 2006 15:55

Re: Problem mit mehrfachen JOIN
 
Hi,

mir ist aufgefallen, dass du noch zwei Klammern vergessen hast.

SQL-Code:
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)
Bin mir aber nicht sicher ob es das Problem löst................... :oops:

Grüße.................. :dance:

PASST 11. Jul 2006 17:04

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.

zwaem86 11. Jul 2006 17:08

Re: Problem mit mehrfachen JOIN
 
Muss das nicht vllt. so aussehen:

SQL-Code:
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)
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............

Güße............

PASST 11. Jul 2006 17:09

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.

PASST 11. Jul 2006 17:16

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.

marabu 11. Jul 2006 17:57

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:
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 ? */
Grüße vom marabu

Michael Habbe 11. Jul 2006 17:59

Re: Problem mit mehrfachen JOIN
 
Zitat:

Zitat von PASST
SQL-Code:
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)
                         ^^^^ <-- hier
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)

Müsste das da (^) nicht tab1 heissen?

Schonmal ohne Where-Klausel probiert?

PASST 12. Jul 2006 09:04

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.

marabu 12. Jul 2006 12:31

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.
Seite 1 von 2  1 2      

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