1.3k Aufrufe
Gefragt in Datenbanken von
Hallo an alle,
ich arbeite mit dem SQL-Server 2000 und 2005
Dort habe ich zwei Tabellen die über eine ID miteinander verknüpft sind.
Fürs bessere Verständnis hier als Beispiel:

Tab1:
ID | Name | Flag
--------------------
1 | name1| 1
2 | name2| 1

Tab2:
ID | KomNr | Kommentar
--------------------------------
1 | 1 | a
1 | 2 | b
2 | 1 | aa
2 | 2 | bb
2 | 3 | cc

Jetzt sollen die beiden Tabellen miteinander Verknüpft werden und die Kommentare zu den einzelnen „Name“ hintereinander stehen.
Als Beispiel:
Name | Kom1 | Kom2 | Kom3 | Kom4 | Kom5
-------------------------------------------------------------
name1 | a | b | null | null | null
name2 | aa | bb | cc | null | null

Die große Herausforderung ist leider, dass das ganze über eine View gelöst werden soll!
Die Ausgabe soll max 5 Kommentare unterstützen. Sobald eine fehlt wird „null“ eingetragen.

Leider komme ich an dieser Stelle überhaupt nicht weiter. Wenn ich ein Select dieser Art mache:
SELECT Tab1.spotName,
Tab2_0.Kommentar AS Kom1,
Tab2_1.Kommentar AS Comment2,
Tab2_2.Kommentar AS Comment3,
Tab2_3.Kommentar AS Comment4,
Tab2_4.Kommentar AS Comment5
FROM Tab1 INNER JOIN
Tab2 AS Tab2_0 ON Tab1.spot_ID = Tab2_0.spot_ID INNER JOIN
Tab2 AS Tab2_1 ON Tab1.spot_ID = Tab2_1.spot_ID INNER JOIN
Tab2 AS Tab2_2 ON Tab1.spot_ID = Tab2_2.spot_ID INNER JOIN
Tab2 AS Tab2_3 ON Tab1.spot_ID = Tab2_3.spot_ID INNER JOIN
Tab2 AS Tab2_4 ON Tab1.spot_ID = Tab2_4.spot_ID
WHERE (Tab2_0.KomNr = 1) AND
(Tab2_1.KomNr = 2) AND
(Tab2_2.KomNr = 3) AND
(Tab2_3.KomNr = 4) AND
(Tab2_4.KomNr = 5)


Dann klappt es zwar, aber natürlich nur, wenn auch für jeden „Name“ 5 Kommentare (siehe where- Klausel) vorhanden sind. Da das ganze aber dynamisch ist, scheitere ich hier schon.

Zur Not müsste das ganze halt auch mit Hilfe von temp-Tabellen gelöst werden.

Ich wäre sehr dankbar über jeden Vorschlag oder Lösungsansatz!
Vielen Dank schon mal vorab!

3 Antworten

0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo TheMaxx,

Probiere mal ein "left join" statt eines "inner join"

Gruß Ralf
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo TheMaxx,

die effizientere Methode ist eine Art pivot-Methode der Form:
SELECT
dbo.Tab1.Name,
MIN(CASE WHEN KomNr = 1 THEN (Kommentar) ELSE NULL END) AS KomNr1,
MIN(CASE WHEN KomNr = 2 THEN (Kommentar) ELSE NULL END) AS KomNr2,
MIN(CASE WHEN KomNr = 3 THEN (Kommentar) ELSE NULL END) AS KomNr3,
MIN(CASE WHEN KomNr = 4 THEN (Kommentar) ELSE NULL END) AS KomNr4,
MIN(CASE WHEN KomNr = 5 THEN (Kommentar) ELSE NULL END) AS KomNr5
FROM
dbo.Tab1 INNER JOIN dbo.Tab2
ON
dbo.Tab1.ID = dbo.Tab2.ID
GROUP BY
dbo.Tab1.Name

Du kannst den Code auch schon mit weiteren KomNrxx vorbelegen, falls diese Werte zu erwarten sind. Diese Variante ist meiner Korrektur deines Codes vorzuziehen, vorallem bei größeren Tabellen.

Gruß
Ralf
0 Punkte
Beantwortet von themaxx Einsteiger_in (5 Punkte)
Hallo Ralf,
super!!!
Ich hatte mich gestern noch ein bisschen mit den Joins versucht. Leider nicht sehr erfolgreich.

Aber deine neue Lösung passt perfekt!

Vielen Dank.
...