| Autor |
Beitrag |
OliverN_26
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Mi 21.09.11 14:32
Hey Leute
Was hat es mit "Left Join" und "Inner Join" auf sich. Bin ich damit bei meinem Problem auf dem richtigen Weg?
Kann mir evt jemand bei folgendem Select helfen?
Ich möchte in einer Formularmaske "alle" Daten sortiert nach "sk_stoerung"."wonr" anzeigen lassen. Also auch die Daten "sk_kommentare", "sk_kundenstamm", sk_termine" und "sk_kontakt". Wie muß das aussehen? Wie ich die Felder angelegt habe, hab ich in einem Bild im Anhang mit geschickt.
vielen vielen Dank .. mein Kopf raucht 
Einloggen, um Attachments anzusehen!
|
|
jaenicke
      
Beiträge: 19338
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 21.09.11 16:39
Bist du, ja. Denn du willst ja alle Einträge aus der Tabelle sk_stoerung, egal ob es dazu Detailwerte gibt oder nicht. Mit einem LEFT OUTER JOIN ordnest du allen Einträgen der linken Tabelle die passenden aus den anderen Tabellen zu. Existiert kein passender Wert in sk_kontakt o.ä. ist die entsprechende Spalte null.
INNER JOIN wäre hingegen wohl nicht passend, da es nur die Einträge liefert, die auf beiden Seiten zusammenpassen.
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Do 22.09.11 00:08
@jaenicke : das da versteht wohl kaum einer.
Leider wurde die Datenbank nicht angegeben, also nur Theorie (gültig für Firebird) :
OUTER ist eher nur syntaxspezifisch, INNER aber nicht ! Es gilt immer : die ON-Bedingung muss erfüllt sein.
FULL JOIN :
Das liefert alles, selbst wenn NULL Werte in einer Tabelle vorhanden sind. Aufgeführte Felder werden angezeigt.
INNER JOIN :
ON-Bedingung gilt, wie übeall, NULL-Werte werden ausgeschlossen. Auf Deutsch : Schnittmenge.
LEFT JOIN :
alles was links steht, also links hinter dem SELECT und die ON-Bedingung erfüllt, das wird geliefert, selbst dann, wenn rechts in den Spalten NULL steht.
RIGHT JOIN :
alles was rechts steht, rechts hinter dem SELECT und die ON-Bedingung erfüllt, das wird geliefert, selbst dann, wenn links in den Spalten NULL steht.
_________________ Gruß
Hansa
|
|
OliverN_26 
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Do 22.09.11 07:42
Morgen
Also ..
Datenbank is ne normale MySQL Datenbank. Ich hab mich noch mal ein wenig in diese JOIN Geschichte eingelesen und das mit dem FULL JOIN ercheint mir tatsächlich sinnvoll
1. Frage:
Mit meinem SELECT bin ich mittlerweile soweit:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| SELECT sk_stoerung.kdnr, sk_stoerung.wo_typ, sk_kundenstamm.vorname, sk_kundenstamm_name, sk_kundenstamm.plz, sk_kundenstamm.ort, sk_kommentare.hs_comment, sk_kommentare.f2_comment, sk_termine.start_date, sk_termine.end_date, sk_kontakt.kontakt_date_1, sk_kontakt.kontakt_bem_1 FROM (sk_stoerung FULL JOIN sk_kundenstamm ON (sk_stoerung.kdnr_intern=sk_kundenstamm.kdnr_intern)) FULL JOIN sk_kommentare ON (sk_stoerung.wonr_intern=sk_kommentare.wonr_intern) FULL JOIN sk_termine ON (sk_stoerung.wonr_intern=sk_termine.wonr_intern) FULL JOIN sk_kontakt ON (sk_stoerung.wonr_intern=sk_kontakt.wonr_intern) ORDER BY sk_stoerung.kdnr |
Ist das soweit richtig?
2. Frage:
Hab ich das richtig gemacht mit den FULL JOIN's? Wie verknüpfe mehrere Tabellen (also mehr als 2) ?
3. Frage:
Muß ich beim SELECT alle Felder aufzeigen, die ich will, oder kann ich auch SELECT * FROM schreiben?
Vielen Dank
|
|
OliverN_26 
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Do 22.09.11 07:56
Ich les grade das FULL JOIN bei MySQL nicht geht.
Geht wohl nur in Verbindung mit LEFT/RIGHT OUTER JOIN und UNION ALL.
Ist das so richitig? Ich frag lieber bevor ich wieder von vorne anfange 
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Do 22.09.11 11:50
Sieht so aus, als müsste man das wirklich mit UNION machen. Zuerst das Left Join, damit alle Datensätze aus der einen Tabelle gefunden werden und dann dasselbe mit Richt Join. Das dann noch per UNION zusammenschmeissen. Sehr mühsam, da die Reihenfolge etc. je nachdem wo man was hinschreibt davon abhängig ist. Es wird sich ja hoffentlich nicht nur lediglich um normale Desktop-DB handeln ?
_________________ Gruß
Hansa
|
|
OliverN_26 
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Do 22.09.11 15:51
Nein, ist es nicht.
Ich bin jetzt ein bisschen weiter. Das ist mein bisheriger Code. So weit ich das überblicke funktioniert das erst einmal:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| SELECT kdnr, name, vorname, kontakt_date_1, f2_comment FROM sk_stoerung AS A LEFT OUTER JOIN sk_kundenstamm AS B ON A.kdnr_intern=B.kdnr_intern LEFT OUTER JOIN sk_kommentare AS C ON A.wonr_intern=C.wonr_intern LEFT OUTER JOIN sk_kontakt AS D ON A.wonr_intern=D.wonr_intern LEFT OUTER JOIN sk_terminzeit AS E ON A.terminzeit_id=E.id LEFT OUTER JOIN sk_techniker AS F ON A.techniker1_id=F.id UNION ALL SELECT kdnr, name, vorname, kontakt_date_1, f2_comment FROM sk_stoerung AS A RIGHT OUTER JOIN sk_kundenstamm AS B ON A.kdnr_intern=B.kdnr_intern RIGHT OUTER JOIN sk_kommentare AS C ON A.wonr_intern=C.wonr_intern RIGHT OUTER JOIN sk_kontakt AS D ON A.wonr_intern=D.wonr_intern RIGHT OUTER JOIN sk_terminzeit AS E ON A.terminzeit_id=E.id RIGHT OUTER JOIN sk_techniker AS F ON A.techniker1_id=F.id ORDER BY kdnr |
Ich habe die Tabellen verändert und ein ER-Diagramm in den Anhang gepackt.
1. Frage: Ist der SELECT so richtig/falsch oder kann man ihn optimieren?
2. Frage: --> ER-Diagramm: Da ich 3 verschiedene Techniker haben müssen diese in "sk_techniker" referenzieren. Mit "techniker1_id" ist das kein Problem aber wie mache ich das mit techniker2_id und techniker3_id? Binde ich die ein sagt er mir ständig das ein Datenfeld aus "sk_techniker" nicht eindeutig ist .. was ja logisch ist, da ich die gleiche Tabelle mehrmals joine. Aber wie kann ich das lösen? Im Grunde müsste es so aussehen, aber geht nicht:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| SELECT kdnr, name, vorname, kontakt_date_1, f2_comment FROM sk_stoerung AS A LEFT OUTER JOIN sk_kundenstamm AS B ON A.kdnr_intern=B.kdnr_intern LEFT OUTER JOIN sk_kommentare AS C ON A.wonr_intern=C.wonr_intern LEFT OUTER JOIN sk_kontakt AS D ON A.wonr_intern=D.wonr_intern LEFT OUTER JOIN sk_terminzeit AS E ON A.terminzeit_id=E.id LEFT OUTER JOIN sk_techniker AS F ON A.techniker1_id=F.id LEFT OUTER JOIN sk_techniker AS G ON A.techniker2_id=G.id <--------------------- LEFT OUTER JOIN sk_techniker AS H ON A.techniker3_id=H.id <--------------------- UNION ALL SELECT kdnr, name, vorname, kontakt_date_1, f2_comment FROM sk_stoerung AS A RIGHT OUTER JOIN sk_kundenstamm AS B ON A.kdnr_intern=B.kdnr_intern RIGHT OUTER JOIN sk_kommentare AS C ON A.wonr_intern=C.wonr_intern RIGHT OUTER JOIN sk_kontakt AS D ON A.wonr_intern=D.wonr_intern RIGHT OUTER JOIN sk_terminzeit AS E ON A.terminzeit_id=E.id RIGHT OUTER JOIN sk_techniker AS F ON A.techniker1_id=F.id RIGHT OUTER JOIN sk_techniker AS G ON A.techniker2_id=G.id <--------------------- RIGHT OUTER JOIN sk_techniker AS H ON A.techniker3_id=H.id <--------------------- ORDER BY kdnr |
3. Frage: --> ER-Diagramm: Wie komme ich an die Daten "event_name" / "start_date" / "end_date" aus der Tabelle "tevents" (Tabelle ganz rechts unten) ?
Danke
|
|
|