Autor Beitrag
OliverN_26
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 22.09.11 00:08 
@jaenicke : das da versteht wohl kaum einer. :mrgreen:

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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