Outer Joins vermeiden

23/08/2007 - 09:23 von Thomas Schremser | Report spam
Hallo allerseits!

Ich habe auf einem SQL Server 2005 eine Tabelle "Berechtigung", in der zu
einer Person ein oder mehrere Datensàtze gespeichert sind. Jeder Datensatz
hat dabei einen von drei möglichen Codes und jeder Code kann pro Person nur
ein einziges mal vorkommen. Hier ein paar Beispieldaten:

PersonID Code Datum Ort
1 PRO 01.01.1974 Wien
2 PRO 02.09.1960 Graz
3 APP 17.11.1982 Prag
3 NOS 27.06.1985 Wien


Nun möchte ich eine Sicht erstellen, in der pro Person nur ein einziger
Datensatz vorkommt die unter anderem die Daten der Tabelle enthàlt. Mit
den Beispieldaten soll das dann so aussehen:

PersonID PRO_Datum PRO_Ort APP_Datum APP_Ort NOS_Datum NOS_Ort
-
1 01.01.1974 Wien NULL NULL NULL NULL
2 02.09.1960 Graz NULL NULL NULL NULL
3 NULL NULL 17.11.1982 Prag 27.06.1985 Wien

Ich habe das zunàchst mit folgendem Statement versucht:

SELECT S.PersonID,
P.Datum AS PRO_Datum,
P.Ort AS PRO_Ort,
A.Datum AS APP_Datum,
A.Ort AS APP_Ort,
N.Datum AS NOS_Datum,
N.Ort AS NOS_Ort
FROM stf.PersonStamm S
LEFT OUTER JOIN stf.Berechtigung P ON P.PersonID = S.PersonID
AND P.Code = 'PRO'
LEFT OUTER JOIN stf.Berechtigung A ON A.PersonID = S.PersonID
AND A.Code = 'APP'
LEFT OUTER JOIN stf.Berechtigung N ON N.PersonID = S.PersonID
AND N.Code = 'NOS'

Das funktioniert zwar, ist aber wegen der OUTER JOIN quàlend langsam.

Sieht irgendjemand eine Möglichkeit, das selbe Ergebnis ohne OUTER JOIN zu
erzielen?

TIA

Grüße
Thomas

Any problem in computer science can be solved with another layer
of indirection. But that usually will create another problem.
David Wheeler
 

Lesen sie die antworten

#1 Frank Kalis
23/08/2007 - 10:32 | Warnen spam
"Thomas Schremser" wrote:

Ich habe auf einem SQL Server 2005 eine Tabelle "Berechtigung", in der zu
einer Person ein oder mehrere Datensàtze gespeichert sind. Jeder Datensatz
hat dabei einen von drei möglichen Codes und jeder Code kann pro Person nur
ein einziges mal vorkommen. Hier ein paar Beispieldaten:

PersonID Code Datum Ort
1 PRO 01.01.1974 Wien
2 PRO 02.09.1960 Graz
3 APP 17.11.1982 Prag
3 NOS 27.06.1985 Wien


Nun möchte ich eine Sicht erstellen, in der pro Person nur ein einziger
Datensatz vorkommt die unter anderem die Daten der Tabelle enthàlt. Mit
den Beispieldaten soll das dann so aussehen:

PersonID PRO_Datum PRO_Ort APP_Datum APP_Ort NOS_Datum NOS_Ort
-
1 01.01.1974 Wien NULL NULL NULL NULL
2 02.09.1960 Graz NULL NULL NULL NULL
3 NULL NULL 17.11.1982 Prag 27.06.1985 Wien

Ich habe das zunàchst mit folgendem Statement versucht:

SELECT S.PersonID,
P.Datum AS PRO_Datum,
P.Ort AS PRO_Ort,
A.Datum AS APP_Datum,
A.Ort AS APP_Ort,
N.Datum AS NOS_Datum,
N.Ort AS NOS_Ort
FROM stf.PersonStamm S
LEFT OUTER JOIN stf.Berechtigung P ON P.PersonID = S.PersonID
AND P.Code = 'PRO'
LEFT OUTER JOIN stf.Berechtigung A ON A.PersonID = S.PersonID
AND A.Code = 'APP'
LEFT OUTER JOIN stf.Berechtigung N ON N.PersonID = S.PersonID
AND N.Code = 'NOS'

Das funktioniert zwar, ist aber wegen der OUTER JOIN quàlend langsam.

Sieht irgendjemand eine Möglichkeit, das selbe Ergebnis ohne OUTER JOIN zu
erzielen?




PIVOT() ?!?
Frank Kalis
Microsoft SQL Server MVP
Webmaster: http://www.insidesql.de

Ähnliche fragen