saschbert
Goto Top

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

Content-ID: 89180

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

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

bytecounter
bytecounter 05.06.2008 um 12:37:37 Uhr
Goto Top
Hallo,

ich würde das ganz einfach mit einem "inner join" erledigen.

http://www.sql-tutorial.net/SQL-JOIN.asp

vg Bytecounter
Logan000
Logan000 05.06.2008 um 13:20:40 Uhr
Goto Top
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
Saschbert
Saschbert 05.06.2008 um 13:25:33 Uhr
Goto Top
Vielen Dank erstmal. Aber ich glaube, Du hast das Problem nicht erkannt. Durch einen einfachen Join wäre die Ausgabe folgendermaßen:

Name | Werte
ABCD | 502001
ABCD | 502002
EFGH | 502000
IJKL | 502000
IJKL | 502002
IJKL | 500000

Was ich suche, ist jedoch eine Möglichkeit, quasi direkt im Resultset die Werte aus Tabelle B Kommagetrennt in einer Spalte zu erhalten. Und dabei hilft mir auch kein InnerJoin, bin ich der Meinung.
Saschbert
Saschbert 05.06.2008 um 13:29:21 Uhr
Goto Top
Vielen Dank Logan00!

Aber Du machst mir Angst face-smile
Diese Artikel habe ich auch schon gefunden, aber nicht viel mit anfangen können. Wie dem auch seit, ich muss wohl in den sauren Apfel beißen, und mich in die Cursorproblematik einarbeiten.
Logan000
Logan000 05.06.2008 um 14:20:46 Uhr
Goto Top
So schlimm ist das auch nicht.

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
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.
Saschbert
Saschbert 05.06.2008 um 15:17:49 Uhr
Goto Top
WOW! Vielen Dank Dir! Wusste garnicht, dass man im Cursor zwei Variablen angeben kann (... INTO @id, @Name ...), das erklärt natürlich alles. Ich konnte das jetzt in der Eile der Zeit noch nicht testen, werde das aber nachholen und berichten. Nochmals vielen Dank!
filippg
filippg 05.06.2008 um 19:35:50 Uhr
Goto Top
Wenn man Cursor nicht mag sollte das auch mit einer Benutzerdefinierten Funktion gehen.

Gruß

Filipp
Saschbert
Saschbert 05.06.2008 um 21:37:22 Uhr
Goto Top
Ja, an sowas ähnliches hatte ich auch schon gedacht, nur denke ich, die Funktion wäre recht umfangreich, weil ich ja mit verschiedenen Abfragen prüfen muss, wieviele Datensätze enthalten sind, diese quasi einzeln extrahieren, usw ... hatte auch schon überlegt, ob ich quasi einfach mit mehreren Variablen arbeite ... aber alles noch ungewiss.

Also mein Ansatz war, innerhalb der Funktion quasi in einer simpeln abfrage per TOP einer Variable den ersten Wert zuzuweisen, in einer weiteren simplen Abfrage der nächsten Variable per TOP ebenfalls einen Wert zuzuweisen, der nicht identisch mit dem ersten sein darf ... das ganze insgesammt 4x (können max 4 Werte sein!), und schon habe ich das. Und in der RETURN Variable dann durch z.B. CASE entsprechend die Kommata einfügen, sofern Vaiable 2 ebenfalls größer NULL ist ... oder so ...

Aber der CURSOR reizt mich alleine deswegen, weil ich bisher immer vermieden habe, diesen Schritt zu gehen, aber ich denke, es wohl nicht schlecht wäre, dies mal zu machen, um einfach mit Cursorn arbeiten zu können. face-smile

Aber vielen Dank für den Hinweis!