La risposta scelta da @ OlegDok di può restituire il risultato corretto. Ma la performance può essere terribile. Questo scenario di test lo illustrerà.
Creazione di una tabella temporanea:
CREATE table #temp (EmpId INT, EmpName VARCHAR(100))
;WITH N(N)AS
(SELECT 1 FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N)),
tally(N)AS(SELECT ROW_NUMBER()OVER(ORDER BY N.N)FROM N,N a,N b,N c,N d,N e,N f)
INSERT #temp
SELECT EmpId, EmpName FROM (values(1, 'Mary'),(1, 'John'),(1, 'Sam')) x(EmpId, EmpName)
CROSS APPLY
(SELECT top 2000 N FROM tally) y
UNION ALL
SELECT EmpId, EmpName FROM (values(2, 'Alaina'),(2, 'Edward')) x(EmpId, EmpName)
CROSS APPLY
(SELECT top 2000 N FROM tally) y
Questo è solo 10.000 righe. Ma un sacco di identico EmpId.
Questa query nella risposta di Oleg ha impiegato 64 secondi nel mio database.
SELECT distinct
EmpId,
(
SELECT EmpName+','
FROM #temp t2
WHERE t2.EmpId = t1.EmpId
FOR XML PATH('')
) Concatenated
FROM #temp t1
DISTINCT non è il modo corretto di pulizia righe in questa situazione. Per evitare questo join cartesiano, ridurre il numero iniziale di ID prima di unirsi in questo modo.
Questo è il modo corretto di gestire questo:
;WITH CTE as
(
SELECT distinct EmpId
FROM #temp
)
SELECT
EmpId,
STUFF((
SELECT ','+EmpName
FROM #temp t2
WHERE t2.EmpId = t1.EmpId
FOR XML PATH('')
), 1,1,'') Concatenated
FROM CTE t1
Questo richiede meno di 1 secondo
Quale SQL Versione del server?Hai guardato http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-ms-sql-server-2005 – BartekR
Sto usando SQL Server 2008 @ BartekR – Gurvinder
@OlegDok come sono nuovo a sql ho provato quel post ma sono confuso per column_names in quello .. :( – Gurvinder