2012年12月11日 星期二

一秒看破 T - SQL 多筆欄位合併

外表看似簡單難度卻異於常人的 T - SQL 這次又有什麼新難題呢?

就讓我們看下去

首先我有三張表 兩張 List 表 一張 Mapping 表

原先 Hyperlink 跟 Tag 的對應關係為多對多 但是為了符合正規化 拆成兩組 一對多的形式 非常常見

需求也還算合理 我想看到 每個 Hyperlink 對應的 TagName

但是我想要 不管有多少 TagName 都收錄於同一筆之中

各位看官如果沒有試過的話 不妨先自行嘗試一遍 如果輕易的就解開了 表示您已經是踢吸摳之神 值得瞻仰





就跟魔術一樣說穿了其實沒那麼難 主要需要 JOIN 跟 子查詢 這都不難想像

但是最難的應該就是這個合併成一行的 TagName

定番 估狗了一下 發現 FOR XML 子句

神人文:http://www.dotblogs.com.tw/chhuang/archive/2008/03/19/1926.aspx

簡單來說就是把查詢結果變成一行 XML 來表示

目前是針對單一比的合併 要跟 整張 Hyperlink 合併 就要借助子查詢了

但是身為具有偏執狂熱的PG 不可能允許 那個多餘的 逗點

使用 STUFF 函數 來搞定





備忘


SELECT Title, Url,
STUFF((
    SELECT DISTINCT ',' + T.TagName FROM Hyperlink AS H
    JOIN HyperlinkTag AS HT ON H.ID = HT.HyperlinkID
    JOIN Tag AS T ON T.ID = HT.TagID
    WHERE H.ID = Hyperlink.ID
    FOR XML PATH('')
),1,1,'') AS 'Tags'
FROM Hyperlink

沒有留言:

張貼留言