經常遇到統計報表中,子表記錄合並為一個字段的情況。例如:省表中各省經濟水平前五的城市統計。
有如下兩表:dbo.省 和 dbo.市 (好吧,你可能會吐槽為什么用中文表名,其實我是為了方便查找替換)
這里暫時不考慮經濟水平前五這種外部條件,期望將所有城市使用中文逗號拼接起來,如圖:
具體做法如下:
--基於子表查詢 SELECT P.Name AS '省', STUFF((SELECT ','+Name FROM dbo.市 WHERE Parent=C.Parent FOR XML PATH('')),1,1,'') AS '市' FROM dbo.市 C LEFT JOIN dbo.省 P ON C.Parent = P.Code GROUP BY C.Parent, P.Name ORDER BY C.Parent --基於父表查詢 SELECT P.Name AS '省', XC.City AS '市' FROM dbo.省 P LEFT JOIN( SELECT STUFF((SELECT ','+Name FROM dbo.市 WHERE Parent=C.Parent FOR XML PATH('')),1,1,'') AS 'City', Parent FROM dbo.市 C GROUP BY C.Parent ) XC ON P.Code=XC.Parent ORDER BY P.Code
這里有兩種查詢方式,基於子表會忽略沒有下屬城市的省記錄,例如直轄市;而基於父表則會在子表集合列顯示NULL值,兩種情況分場景使用。
語法解釋:
STUFF('STRING',1,1,'')
根據MSDN幫助,可以了解到,這是一個字符串替換函數,將參數1的字符串,從參數2位置(數據庫索引通常從1開始,而不是0)開始截取,截取長度為參數3,截取的部分替換為參數4。
SELECT STATEMENT FOR XML PATH('')
這里的 SELECT STATEMENT 是常規查詢語句,結果為xml集合,因此可以包括二維數據表。
但構建此查詢的目的是為了拼接一維的數據,因此這里的查詢語句通常只查詢一個字段,並在字段前使用分隔符。示例中使用的分隔符為中文逗號。
具體的FOR XML PATH語法可以參考MSDN。
轉載請注明出自飛揚的塵埃的博客園。