我知道的是,「合併多行到列表」的問題已經回答了無數次,這裏是一個真棒文章的引用:Concatenating row values in transact sql將多個行到列表中多列
我有必要以多行同時
ID | Col1 | Col2 ID | Col1 | Col2
------------------ => ------------------
1 A X 1 A X
2 B Y 2 B,C Y,Z
2 C Z
我嘗試使用XML方法合併爲多列清單,但是這已經被證明是在大表非常慢
SELECT DISTINCT
[ID],
[Col1] = STUFF((SELECT ',' + t2.[Col1]
FROM #Table t2
WHERE t2.ID = t.ID
FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'),1,1,''),
[Col2] = STUFF((SELECT ',' + t2.[Col2]
FROM #Table t2
WHERE t2.ID = t.ID
FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'),1,1,''),
FROM #Table t
我目前的解決方案是使用一個存儲過程來分別構建每個ID行。我不知道是否還有另一種方法,我可以使用(不是使用循環等)
For each column, rank the rows to combine (partition by the key column)
End up with a table like
ID | Col1 | Col2 | Col1Rank | Col2Rank
1 A X 1 1
2 B Y 1 1
2 C Z 2 2
Create a new table containing top rank columns for each ID
ID | Col1Comb | Col2Comb
1 A X
2 B Y
Loop through each remaining rank in increasing order (in this case 1 iteration)
for irank = 0; irank <= 1; irank++
update n set
n.col1Comb = n.Col1Comb + ',' + o.Col1, -- so append the rank 2 items
n.col2comb = n.Col2Comb + ',' + o.Col2 -- if they are not null
from #newtable n
join #oldtable o
on o.ID = n.ID
where o.col1rank = irank or o.col2rank = irank
這是很整潔......我會做一些性能測試對我相當快速存儲過程並回報。你能分享關於你如何找到這個解決方案的更多細節嗎?或者爲什麼需要訂單?更新是否總是根據CTE中使用的順序進行? – user1002479
謝謝,我正準備對大型設備做一些測試。在字符串連接時,需要使用order by來控制分組。我知道四種聚合字符串的方法,這些方法可以在性能方面進行比較(這裏按照我懷疑會最慢到最快的順序列出):遊標循環,.net CLR,XML和CTE。 –
由於數據集越來越大,這比我放在一起的循環方法慢得多。較之前幾秒緩慢,但仍然比XML方法快得多(對於120k行:12圈vs 14cte vs 29xml秒)。我試圖在ID列上添加一個索引,但這沒有幫助。任何改進這一個想法? – user1002479