Delphi-PRAXiS
Seite 2 von 2     12   

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 13. Jul 2006 09:29

Re: Problem mit mehrfachen JOIN
 
Sorry für meine verspätete Antwort.

So, ich habe mir den SQL Text und das Resultat nochmals angeschaut und festgestellt, dass die Abfrage ausschließlich mit den tab1..3 nicht korrekt funktioniert - entgegen meiner vorherigen Behauptungen. Die Anzahl der Sätze dort ist auch nicht richtig.

Die Beziehungen der Tabellen untereinander möchte ich nochmals anders darstellen. Vielleicht hilft das.
SQL-Code:
tab1 n:1 tab2
tab2 n:1 tab3
tab1 n:1 tab4
Mir hat jemand den Tipp gegeben, in der WHERE-Klausel auf die IS NULL Bedingungen zu verzichten und die fehlenden Sätze stattdessen mit UNION-Verbindungen zu ergänzen. Das ganze scheint mir recht kompliziert zu sein. Ich werde es mir jetzt als nächstes mal anschauen.

Aus meinen bisherigen Versuchen vermute ich, dass die von mir gedachte Abfrage tatsächlich nicht möglich ist. Interessieren würde mich jetzt aber schon warum?

Gruß
Peter

omata 13. Jul 2006 13:37

Re: Problem mit mehrfachen JOIN
 
Hallo PASST,

vielleicht kannst du uns ja mal erklären was du eigentlich machen bzw. als Ergebnis herausbekommen möchtest. Das du mehr Datensätze herausbekommst als in Tab1 enthalten sind ist doch klar. Wenn in einer der anderen Tabellen auf mehr als einen Datensatz in Tab1 verwiesen wird, muss der entsprechende Datensatz aus Tab1 mehrfach ausgegeben werden.

Vielleicht kannst du ja mal genau schreiben was du eigentlich haben möchtest, ich konnte das bis jetzt noch nicht erkennen.

Gruss
Thorsten

PASST 13. Jul 2006 15:52

Re: Problem mit mehrfachen JOIN
 
So, jetzt kann ich endlich antworten.

Vorab folgende Info: Ich habe festgestellt, dass wider Erwarten die Beziehung von tab1 zu tab2 n:m war. Ich habe tab2 jetzt bearbeitet, so dass tatsächlich eine n:1 Beziehung zw. tab1 und tab2 besteht.

Was will ich eigentlich konkret?

Ich will eine Schnittstelle schreiben, die es erlaubt eine Einkaufsdatei vom Lieferanten mit unseren Artikelnamen zu ergänzen. Die Einkaufsdatei ist tab1 und die Übersetzungsdatei für unsere Artikel ist tab2. Da in der Einkaufsdatei ein Artikel mehrfach eingetragen sein kann, aber es je Position nur eine Artikelzuordnung geben kann, ist die Beziehung zw. tab1 und tab2 n:1.
Ich möchte also zu jeder Einkaufsposition unseren Artikelnamen anzeigen. Ist noch keine Artikelzuordnung vorhanden, so soll mir die Einkaufsposition trotzdem angezeigt werden.
(tab3 und tab4 lasse ich erstmal außer acht.)
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)
WHERE (tab2.Feld5 IS NULL OR tab2.Feld5=100)
Im Detail habe ich für die Artikelzuordnung zwei Kriterien, was aber keinen Unterschied machen sollte.

Verwende ich nur das WHERE-Kriterium =100, dann erhalte ich korrekterweise nur die Einkaufspositionen für die eine Artikelnamenzuordnung existiert. Verwende ich beide Kriterien, so erhalte ich aber immer noch weniger Einkaufsposition wie vorhanden sind. Insgesamt fehlen 3 Stück.

Gruß
Peter

omata 13. Jul 2006 18:10

Re: Problem mit mehrfachen JOIN
 
Hallo PASST,

versuch es doch mal so...

SQL-Code:
SELECT t1.FeldA, t2.FeldB
FROM tab1 t1
LEFT JOIN tab2 t2 
  ON    t1.Feld1 = t2.Feld1 
     AND t1.Feld2 = t2.Feld2
     AND COALESCE(t2.Feld5, 100) = 100
eventuell kennt dbase COALESCE nicht...

SQL-Code:
SELECT t1.FeldA, t2.FeldB
FROM tab1 t1
LEFT JOIN tab2 t2 
  ON    t1.Feld1 = t2.Feld1 
     AND t1.Feld2 = t2.Feld2
     AND (   t2.Feld5 IS NULL
          OR t2.Feld5 = 100)
Gruss
Thorsten

PASST 13. Jul 2006 18:40

Re: Problem mit mehrfachen JOIN
 
Bin gerade zuhaus und habe leider kein Delphi zur Hand. Ich werde das ganze mir morgen auf der Arbeit anschauen.

Aber schon mal ein paar Kommentare.
Soweit ich weiß, kann dbase tatsächlich kein Coalesce - aber nebenbei bemerkt, ist das hier nicht die Frage ob localSQL kein Coalesce kann?
Die zweite Variante ist mir auch neu sie überhaupt so zu schreiben. Es schaut recht plausibel aus, sieht mir aber nach einer Syntaxvariante aus, die zum gleichen Ergebnis führt. Ich lass mich morgen mal überraschen.

Ich bin für weitere Vorschläge offen :)

Peter

PASST 13. Jul 2006 19:30

Re: Problem mit mehrfachen JOIN
 
Und nochmal ein bisken Senf dazu.

Ich befürchte, irgendwer oder irgendwas will mich hier ärgern. Ich habe jetzt versucht die gleiche Abfrage auf einem MS SQL Server 2000 nachzubilden. Ich habe ähnlich Daten genommen, für die aber in der LEFT OUTER JOIN Verknüpfung das selbe gelten MUSS. Ich habe eine Kundentabelle tKdn, jeder Kunden ist dort genau einmal aufgeführt, und eine Tabelle Aufträge tAuftr. Verknüpft sind beide über die Kundennr. Die Beziehung zw tKdn und tAuftr ist logischerweise 1:n. Ebenfalls hat nicht jeder Kunde Aufträge.
SQL-Code:
select count(distinct kundnr)
from tKdn left outer join tAuftr
on tKdn.kundnr=tAuftr.kundnr
Dies sollte mir die Anzahl aller Kunden ausgeben. Als Ergebnis erhalte ich aber nur die Anzahl aller Kunden, für die ein Auftrag existiert. Und das ganze habe ich mit dem Query-Tool vom MS SQL Server gemacht -also kein BDE und localSQL.

Ich habe den Verdacht, dass ich bzgl. OUTER JOIN irgendwas komplett falsch verstanden habe, obwohl alle Definitionen, die ich im Inet gefunden habe, meine bisherige Meinung bestätigen.

Verzweiflung am eigenen Verstand macht sich langsam bei mir breit :(

Peter

Jelly 13. Jul 2006 21:09

Re: Problem mit mehrfachen JOIN
 
Also für die Anzahl der Kunden zu erhalten musst du doch nicht joinen:
SQL-Code:
select count(*) as Anzahl from tKdn

PASST 13. Jul 2006 22:33

Re: Problem mit mehrfachen JOIN
 
Count war nur als Bsp gedacht.

PASST 14. Jul 2006 09:57

Re: Problem mit mehrfachen JOIN
 
@omata (Beitrag #14)

Vielen Dank, deine zweite Variante, wenn auch ohne IS NULL, funktioniert. IS NULL wird ja durch das LEFT OUTER JOIN überflüssig.
Jetzt wo ich weiß, dass es funktioniert, ist mir die Logik dahinter auch klar :)

Die n:1-Beziehung zw. tab1 und tab2 gilt nur bei Verlinkung von Feld1, Feld2 UND Feld5. Verlinke ich nur Feld1 und 2, so erhalte ich (natürlich) mehr Kombinationen im Ergebnis. Argh! :oops:

Danke nochmals an alle, die mir geholfen haben.
Peter


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:14 Uhr.
Seite 2 von 2     12   

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