Mit MS SQL Server 2005, wie ich Detail Records in eine einzige durch Kommata getrennte Liste konsolidieren
-
23-08-2019 - |
Frage
HINTERGRUND: ** Ich verwende ** MS2005 . Ich habe eine Master-Tabelle (ID, mdesc) und eine DETAIL Tabelle (MID, DID, DDESC) mit Daten wie folgt
1 MASTER_1
2 MASTER_2
1 L1 DETAIL_M1_L1
1 L2 DETAIL_M1_L2
1 L3 DETAIL_M1_L3
2 L1 DETAIL_M2_L1
2 L2 DETAIL_M2_L2
Wenn ich kommen Sie mit den Tabellen mit
SELECT M.*, D.DID FROM MASTER M INNER JOIN DETAIL D on M.ID = D.MID
Ich erhalte eine Liste wie folgt aus:
1 MASTER_1 L1
1 MASTER_1 L2
1 MASTER_1 L3
2 MASTER_2 L1
2 MASTER_2 L2
FRAGE: Gibt es eine Möglichkeit, eine MS SQL-Select-Anweisung zu verwenden, um die Detaildatensätze in eine durch Kommata getrennte Liste wie folgt zu erhalten:
1 MASTER_1 "L1, L2, L3"
2 MASTER_2 "L1, L2"
Lösung 2
Durch das Konzept in der Verbindung von Bill Karwin, es ist die CROSS APPLY , die es
macht ArbeitSELECT ID, DES, LEFT(DIDS, LEN(DIDS)-1) AS DIDS
FROM MASTER M1 INNER JOIN DETAIL D on M1.ID = D.MID
CROSS APPLY (
SELECT DID + ', '
FROM MASTER M2 INNER JOIN DETAIL D on M2.ID = D.MID
WHERE M1.ID = M2.ID
FOR XML PATH('')
) pre_trimmed (DIDS)
GROUP BY ID, DES, DIDS
Ergebnisse:
ID DES DIDS
--- ---------- ---------------
1 MASTER_1 L1, L2, L3
2 MASTER_2 L1, L2
Andere Tipps
Sie müssen eine Funktion: -
CREATE FUNCTION [dbo].[FN_DETAIL_LIST]
(
@masterid int
)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @dids varchar(8000)
SELECT @dids = COALESCE(@dids + ', ', '') + DID
FROM DETAIL
WHERE MID = @masterid
RETURN @dids
END
Verbrauch: -
SELECT MASTERID, [dbo].[FN_DETAIL_LIST](MASTERID) [DIDS]
FROM MASTER
coalesce ist dein Freund.
declare @CSL vachar(max)
set @CSL = NULL
select @CSL = coalesce(@CSL + ', ', '') + cast(DID as varchar(8))
from MASTER M INNER JOIN DETAIL D on M.ID = D.MID
select @CSL
Dies wird für eine generali Abfrage nicht gut funktionieren (d funktioniert gut für einen einzigen Stammsatz).
Sie können dies in einer Drop-Funktion ... aber das kann man nicht die Leistung, die Sie brauchen / wollen.
Dies ist der Zweck von MySQL GROUP_CONCAT()
Aggregatfunktion. Leider ist es nicht ganz einfach, diese Funktion in anderen RDBMS Marken zu duplizieren, dass es nicht unterstützen.
Siehe Simulieren Group_concat MySQL-Funktion in Microsoft SQL Server 2005?
Ich glaube, Sie brauchen eine Funktion für dieses in der letzten Version von SQL Server ordnungsgemäß funktionieren:
http://sqljunkies.com /WebLog/amachanic/archive/2004/11/10/5065.aspx?Pending=true