SQL Server 聯表字段合並查詢


經常遇到統計報表中,子表記錄合並為一個字段的情況。例如:省表中各省經濟水平前五的城市統計。

有如下兩表: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

轉載請注明出自飛揚的塵埃的博客園

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM