Anmelden

View Full Version : Left join Verständnis Frage



Seiten : [1] 2

KingofKning
17-11-14, 12:09
Hallo *all,

ich hab da mal ne Frage:

Ich muß eine Datei erstellen in der die Kunden mit einer bestimmtem E-Mail Adresse angezeigt werden.

Aufbau Datei 1:
Kunden-Nr Anschrift etc.
0001 Karnickelhausen
0002 Maulwufshügel
0003 Spechtbau

Aufbau Datei 2:
Kunden-Nr. E-Mail Adresse Typ
0001 1.Karnickel@Karnickelhausen 1
0001 2.Karnickel@Karnickelhausen 2
0001 3.Karnicke@Karnickelhausen 3
0002 1.Maulwurf@Maulwufshügel 1
0002 2.Maulwurf@Maulwufshügel 2

Jetzt soll die Ausgabe so aussehen:

0001 Karnickelhausen 1.Karnickel@Karnickelhausen 1
0002 Maulwufshügel 1.Maulwurf@Maulwufshügel 1
0003 Spechtbau

Dachte ich kein Problem, machst Du ein left join und bis dabei.

select * from datei1, datei2 on kunden-Nr = Kunden-Nr. where datei2.typ = 1

sobald ich aber in Datei2 die Einschränkung auf Typ=1 mache, bekomme ich nur noch Sätze mit existierender E-Mail Adresse angezeigt. Der Spechtbau ohne Adresse fällt raus.
Ohne die Einschränkung habe ich auch den Spechtbau drin aber dafür natürlich alle Sätze so oft wie E-Mail Einträge.

Wie müßte dann die Abfrage richtig lauten um alle Sätze mit E-Mail Typ1 und auch die Sätze ohne E-Mail zu sehen?

GG

malzusrex
17-11-14, 12:15
Ohne geprüft zu haben


Select datei1.Kundennr, datei1.adresse, coalesce(datei2.email, ' ')
from datei1
left join datei2 on datei1.kundennr = datei2.kundennr
where datei2.typ = 1


Gruß
Ronald

Fuerchau
17-11-14, 12:15
Sobald auf eine Joindatei mit einem fixen Wert verglichen wird, entsteht daraus sofort ein Inner-Join.
Alternative1:
where datei2.typ = 1 or datei2.typ is null
Alternative2:
where coalesce(datei2.typ, 1) = 1

BenderD
17-11-14, 12:17
select *
from datei1 d1 left outer join
( select * from datei2
where type = 1) d2
on d1.kundeNr = d2.kundeNr

den subselect kann man je nach gusto auch als CTE vernageln

D*B

Pikachu
17-11-14, 12:27
Nimm mal die Einschränkung nach dem Typ mit in das ON und probiers mal so:

SELECT * FROM D1 LEFT OUTER JOIN D2 ON D1.KUNDE=D2.KUNDE AND D2.TYP=1

Fuerchau
17-11-14, 12:33
Jetzt haben wir schon Alternative 3 + 4.
Gibt's noch weitere:p?

Ronalds Lösung ist zumindest die einzige, die definitiv nicht funktioniert.

KingofKning
17-11-14, 12:37
Danke, habe die or is null Variante gewählt.GG

malzusrex
17-11-14, 13:05
Hm,
gerad mal gestetst. Geht inder Form wirklich nicht.
Geht nur, wenn man den where auf den Typ weg lässt, und Kunde 3 zB gar nicht in Datei2 ist

Gruß
Ronald

KingofKning
17-11-14, 13:09
Tja, die is null Variante fällt dann auf die Nase wenn es einen Eintrag in Datei2 <> Typ 1 gibt. Sprich Typ2 gibt es, aber nicht Typ1 den ich haben will.

Werde jetzt mal die andere Variante probieren
GG

Fuerchau
17-11-14, 13:15
Ja stimmt, die beiden anderen Wege sind korrekt da die Datei2 auf den Typ 1 eingeschränkt und die Abfrage im Where entfällt.
Wobei die "on ... Typ = 1" mit Index die schnellste sein wird.