mehrere SQL Ergebnisse in einer Spalte ausgeben
Hallo Community,
benötige mal kurz Eure Hilfe. Ich bin gerade dabei, eine kleine Auswertung zu erstellen, und habe dabei einen Problemfall. Und mir fällt ums verrecken keine Möglichkeit ein. Wahrscheinlich ginge es mit einem Cursor oder so, aber mit Cursorn habe ich mich noch nicht beschäftigt.
System:
MS SQL 2005 Server
Hintergrund:
Ich habe eine recht komplexe, aber strukturierte Datenbank, in der Tabellen i.d.R. über eindeutige Kriterien zugeordnet sind, entweder in 1:1 oder 1:n Beziehungen.
Problem:
Ich habe zwei Tabellen, mit einem 1:n Verhältnis. Nun muss ich in einer Abfrage quasi eine Ausgabe erhalten, in der mir in Spalte 1 der eindeutige Index, der beide Tabellen verbindet, angezeigt wird, und in Spalte 2 möchte ich quasi ein Teilergebnis aus der zweite Tabelle erhalten, jedoch Kommagetrennt. Dies können maximal 4 sein, in meinem Modell, daher tragbar.
Beispiel:
Tabelle A
Id | Name
01 | ABCD
02 | EFGH
03 | IJKL
Tabelle B
Id | IdTabA | Wert
01 | 01 | 502001
02 | 01 | 502002
03 | 02 | 502000
04 | 03 | 502000
05 | 03 | 502002
06 | 03 | 500000
Ausgabe:
Name | Werte
ABCD | 502001, 502002
EFGH | 502000
IJKL | 502000, 502002, 500000
Ich hoffe, Ihr versteht, was ich meine. Die eigentliche Abfrage ist wesentlich komplizierter, aber das bekomme ich hin. Es ist nur diese eine Stelle, die ich hier mal vereinfacht skizzierte, die mir die Sorgenfalten auf die Stirn treibt.
Vielen Dank schon vorab,
Saschbert
benötige mal kurz Eure Hilfe. Ich bin gerade dabei, eine kleine Auswertung zu erstellen, und habe dabei einen Problemfall. Und mir fällt ums verrecken keine Möglichkeit ein. Wahrscheinlich ginge es mit einem Cursor oder so, aber mit Cursorn habe ich mich noch nicht beschäftigt.
System:
MS SQL 2005 Server
Hintergrund:
Ich habe eine recht komplexe, aber strukturierte Datenbank, in der Tabellen i.d.R. über eindeutige Kriterien zugeordnet sind, entweder in 1:1 oder 1:n Beziehungen.
Problem:
Ich habe zwei Tabellen, mit einem 1:n Verhältnis. Nun muss ich in einer Abfrage quasi eine Ausgabe erhalten, in der mir in Spalte 1 der eindeutige Index, der beide Tabellen verbindet, angezeigt wird, und in Spalte 2 möchte ich quasi ein Teilergebnis aus der zweite Tabelle erhalten, jedoch Kommagetrennt. Dies können maximal 4 sein, in meinem Modell, daher tragbar.
Beispiel:
Tabelle A
Id | Name
01 | ABCD
02 | EFGH
03 | IJKL
Tabelle B
Id | IdTabA | Wert
01 | 01 | 502001
02 | 01 | 502002
03 | 02 | 502000
04 | 03 | 502000
05 | 03 | 502002
06 | 03 | 500000
Ausgabe:
Name | Werte
ABCD | 502001, 502002
EFGH | 502000
IJKL | 502000, 502002, 500000
Ich hoffe, Ihr versteht, was ich meine. Die eigentliche Abfrage ist wesentlich komplizierter, aber das bekomme ich hin. Es ist nur diese eine Stelle, die ich hier mal vereinfacht skizzierte, die mir die Sorgenfalten auf die Stirn treibt.
Vielen Dank schon vorab,
Saschbert
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 89180
Url: https://administrator.de/contentid/89180
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo,
ich würde das ganz einfach mit einem "inner join" erledigen.
http://www.sql-tutorial.net/SQL-JOIN.asp
vg Bytecounter
ich würde das ganz einfach mit einem "inner join" erledigen.
http://www.sql-tutorial.net/SQL-JOIN.asp
vg Bytecounter
Die Anzahl der Ergebnisdatensätze beim Join währe (in diesem Bsp.) gleich der Anzahl der DS in Tabelle B.
Ich denke Saschbert möchte nur so viele DS wie in Tabelle A bekommen.
Und ich denke er hat recht. Das wird ohne Cursor nix.
@Saschbert
So schlimm sind Cursor nicht. http://msdn.microsoft.com/de-de/library/ms190028.aspx
Ich denke Saschbert möchte nur so viele DS wie in Tabelle A bekommen.
Und ich denke er hat recht. Das wird ohne Cursor nix.
@Saschbert
So schlimm sind Cursor nicht. http://msdn.microsoft.com/de-de/library/ms190028.aspx
So schlimm ist das auch nicht.
Hier hast Du mal eine Arbeitsgrundlage:
Table_1 ist deine Tabelle A und Table_2 Tabelle B aus deinen Bsp.
Die Performance wird nicht so dolle sein.
Das sind 2 geschachtelte Cursor. Daher kann die Ausführung bei sehr vielen DS etwas dauern.
Hier hast Du mal eine Arbeitsgrundlage:
CREATE TABLE #t (name Varchar(4), Wert varchar(50))
DECLARE @ID varchar(2)
DECLARE @NAME varchar(4)
DECLARE @WERT varchar(50)
DECLARE @RESULT varchar(100)
DECLARE Name_cursor CURSOR FOR SELECT ID, Name FROM Table_1
OPEN Name_cursor
FETCH NEXT FROM Name_cursor INTO @ID , @NAME
SET @RESULT = ''
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE Wert_cursor CURSOR FOR SELECT Wert FROM Table_2 WHERE IDTab1 = @ID
Open Wert_cursor
FETCH NEXT FROM Wert_cursor INTO @Wert
WHILE @@FETCH_STATUS = 0
BEGIN
SET @RESULT = @RESULT + @Wert + ', '
FETCH NEXT FROM Wert_cursor INTO @Wert
END
INSERT INTO #t (name,wert) VALUES (@NAME,@RESULT)
SET @RESULT =''
CLOSE Wert_cursor
DEALLOCATE Wert_cursor
FETCH NEXT FROM Name_cursor INTO @ID , @NAME
END
CLOSE Name_cursor
DEALLOCATE Name_cursor
SELECT * FROM #t
DROP TABLE #t
GO
Die Performance wird nicht so dolle sein.
Das sind 2 geschachtelte Cursor. Daher kann die Ausführung bei sehr vielen DS etwas dauern.