cbruns
Goto Top

SQL Abfrage - Ausgabe von Person mit Privat- und Dienstadresse

Hallo,

ich hoffe, dass meine Anforderung irgendwie umsetzbar ist, habe es leider nicht hinbekommen.
Ich habe in einer Software die folgenden Tabellen:

dtKoerperschaften:
ID Vorname Nachname gueltigBis Fahrtkosten
1 Vorname1 Nachname 1 9998-12-31 1
2 Vorname2 Nachname 2 9998-12-31 0
3 Vorname3 Nachname 3 2016-12-31 1
4 Nachname4 9998-12-31 0

dtAdressen:
ID idKoerperschaft Strasse PrivatPLZ idAdressTyp gueltigBis
1 1 Privatstrasse1 13 PLZ1 1 9998-12-31
2 1 Dienststrasse1 14 PLZ1 3 9998-12-31
3 2 Privatstrasse2 15 PLZ2 1 9998-12-31
4 3 Privatstrasse2 16 PLZ1 1 2016-12-31

idAdressTyp = 1 = Privatadresse
idAdressTyp = 3 = Dienstadresse

Jetzt möchte ich gerne das folgende als Ausgabe bekommen:
IdPerson Vorname Nachname Privatstrasse PrivatPLZ Dienststrasse DienstPLZ
1 Vorname1 Nachname 1 Privatstrasse1 13 PLZ1 Dienststrasse1 14 PLZ1
2 Vorname2 Nachname 2 Privatstrasse2 15 PLZ2 NULL NULL

Es sollen also nicht mehr gültige und ungültige Adressen ignoriert werden. Darüber hinaus sollen die Dienstadressen einer Person nur dann mit ausgegeben werden, wenn sie auch vorhanden sind. Folgendes habe ich bisher:

SELECT k.ID as IdPerson, k.Nachname, k.Vorname, PA.Strasse AS Privatstrasse, PA.IdPlz AS PrivatPLZ, DA.Strasse AS Dienststrasse, DA.IdPlz AS DienstPLZ
	FROM 
		dtKoerperschaften k,
		dtAdressen PA,
		dtAdressen DA
       JOIN dtAdressen PA ON k.ID = PA.idKoerperschaft
       JOIN dtAdressen DA ON k.ID = DA.idKoerperschaft
	WHERE
		AND k.Vorname NOT LIKE ''  
		AND k.gueltigBis = '99981231'  
		AND k.Fahrtkosten = '1'   
		AND PA.IdAdressTyp = '1'  
		AND DA.IdAdressTyp = '3'  

Mein Problem aktuell ist, dass er bei obriger Abfrage nur die Person mit der IdPerson = 1 ausgibt. Lasse ich den Filter "AND DA.IdAdressTyp = '3'" weg bekomme ich bei der Ausgabe die Privatadresse in Privatstrasse & Dienststrasse ausgeben und zusätzlich nochmals den korrekten Datensatz. Leider habe ich keine Möglichkeit gefunden die falsche Ausgabe los zu werden.

Vielen Dank für die Hilfe schonmals im vorraus.

Content-Key: 327965

Url: https://administrator.de/contentid/327965

Ausgedruckt am: 28.03.2024 um 09:03 Uhr

Mitglied: em-pie
Lösung em-pie 30.01.2017 aktualisiert um 15:32:12 Uhr
Goto Top
Mahlzeit,

mit deinem Versuch, die Trennung in der WHERE-Clause unterzubringen, erreichst du ja nur, dass die Ergebnisse ausgegeben werden, die beide Bedingungen erfüllen.

Für dein Vorhaben wäre eine Lösung, mit Inner Joins zu arbeiten und hier dann statt der fertigen Tabelle ein Subselect einzubinden.

Schaue dir mal folgendenden (ungetesteten) Code an
SELECT 
	k.ID as IdPerson
	, k.Nachname
	, k.Vorname
	, PA.Strasse AS Privatstrasse
	, PA.IdPlz AS PrivatPLZ
	, DA.Strasse AS Dienststrasse
	, DA.IdPlz AS DienstPLZ
	
FROM 
	dtKoerperschaften k
INNER JOIN (
	SELECT ID, idKoerperschaft, Strasse, PrivatPLZ
	FROM dtAdressen
	WHERE idAdresstyp=1
	) as PA on k.ID=PA.idKoerperschaft
LEFT JOIN (
	Select ID, idKoerperschaft, Strasse, PrivatPLZ
	from dtAdressen
	WHERE idAdresstyp=3
	) as DA on k.ID=DA.idKoerperschaft
WHERE
	AND k.Vorname NOT LIKE ''  
	AND k.gueltigBis = '99981231'  
	AND k.Fahrtkosten = '1'   

Gruß
em-pie


€dit: 2.Join-Statement angepasst (s.u.)
Mitglied: CBruns
CBruns 30.01.2017 aktualisiert um 15:26:39 Uhr
Goto Top
Hallo em-pie,

vielen Dank für die schnelle Antwort. Das mit dem Inner Join hatte ich schon versucht, aber das der von dir ausfgezeigte Weg auch Möglich ist war mir nicht bekannt. Nach dem "dtKoerperschaften k" das "," war noch zu viel. Und leider wird auch bei dem Inner Join nur der eine Datensatz mit Privat- und Dienstadresse ausgegeben. Die Personen ohne Dienstadressen werden auch hier leider nicht angezeit, hättest du da eventuell noch eine Idee?

EDIT: Habs gefunden! face-smile der zweite JOIN muss natürlich ein LEFT JOIN sein, sonst ist ja logisch, dass ich nur den einen Datensatz erhalte. Vielen Dank!

Gruß
Mitglied: em-pie
em-pie 30.01.2017 um 15:28:14 Uhr
Goto Top
Ja genau, ein LEFT JOIN ist die Lösung...

hatte ich übersehen face-big-smile

und Danke für den Hinweis mit dem ','. Habe ich oben gerade korrigiert, ebenso aus dem zweiten INNER JOIN ein LEFT JOIN gemacht, dann hat man direkt den richtigen Code face-smile