AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Problem mit mehrfachen JOIN
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit mehrfachen JOIN

Ein Thema von PASST · begonnen am 11. Jul 2006 · letzter Beitrag vom 14. Jul 2006
Antwort Antwort
Seite 2 von 2     12   
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Problem mit mehrfachen JOIN

  Alt 13. Jul 2006, 08:29
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Problem mit mehrfachen JOIN

  Alt 13. Jul 2006, 12:37
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
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Problem mit mehrfachen JOIN

  Alt 13. Jul 2006, 14:52
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: Problem mit mehrfachen JOIN

  Alt 13. Jul 2006, 17:10
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
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: Problem mit mehrfachen JOIN

  Alt 13. Jul 2006, 17:40
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
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: Problem mit mehrfachen JOIN

  Alt 13. Jul 2006, 18:30
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
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#17

Re: Problem mit mehrfachen JOIN

  Alt 13. Jul 2006, 20:09
Also für die Anzahl der Kunden zu erhalten musst du doch nicht joinen:
select count(*) as Anzahl from tKdn
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: Problem mit mehrfachen JOIN

  Alt 13. Jul 2006, 21:33
Count war nur als Bsp gedacht.
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#19

Re: Problem mit mehrfachen JOIN

  Alt 14. Jul 2006, 08:57
@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!

Danke nochmals an alle, die mir geholfen haben.
Peter
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz