2009-02-09 56 views
2

我有一個包含聯繫人列表的數據庫表,其中一些聯繫人可能有多個記錄,例如,將重複記錄合併到1字段中

CustomerID, CustomerName, Vehicle 
1, Dan, Mazda 
1, Dan, Suzuki 
2, John, Ford 
3, Dasha, Volvo 
3, Dasha, Ford 

我可以寫一個select查詢以返回不同的customerID和CustomerName,以及一個記錄中的車輛列表嗎?即

1, Dan, Mazda+Suzuki 
2, John, Ford 
3, Dasha, Volvo+Ford 

感謝

+1

你在下面有很多好的答案,所以沒有什麼可以添加的,但我想指出你的數據模型幾乎是數據建模101中的「不該做什麼」的教科書。CustomerID和CustomerName看起來像是一個相當清晰且不必要的數據庫正常化違規。 – 2009-02-09 14:39:17

回答

1

我不知道,如果它可以通過一個簡單的SQL來完成。但是,上次我在sybase的tsql中嘗試這樣做時,我使用了臨時表和遊標。所以至少可以使用該路線完成。

3

還有一些nice answers to this problem on another question

根據the linked article,由於使用XML函數,這隻能在SQL Server 2005之後使用。從文章 -

SELECT table_name, 
     LEFT(column_names,LEN(column_names) - 1) AS column_names 
FROM (SELECT table_name, 
       (SELECT column_name + ',' AS [text()] 
       FROM information_schema.columns AS internal 
       WHERE internal.table_name = table_names.table_name 
       FOR xml PATH ('') 
       ) AS column_names 
     FROM (SELECT table_name 
       FROM  information_schema.columns 
       GROUP BY table_name) AS table_names) AS pre_trimmed; 

第二個版本(由 this post誠然啓發,我 後,無意中發現了寫作的第一個版本):

SELECT table_name, 
     LEFT(column_names,LEN(column_names) - 1) AS column_names 
FROM information_schema.columns AS extern 
     CROSS APPLY (SELECT column_name + ',' 
        FROM information_schema.columns AS intern 
        WHERE extern.table_name = intern.table_name 
        FOR XML PATH('') 
        ) pre_trimmed (column_names) 
GROUP BY table_name,column_names; 

第二CROSS APPLY版本根據 執行計劃,據推測是 ,但我沒有執行 任何基準。

+0

感謝關於group_concat的鏈接 - 給谷歌另一個關鍵字(雖然我認爲Tomalak的帖子上面可能總結了一個地方的選項)。 – Dan 2009-02-09 10:22:06

0

我敢肯定,你不能通過一個單一的SQL查詢。

如果是常規要求,則應爲每個客戶ID調用一個函數。

SELECT abc.CustomerID, 
     dbo.udf_getCSVCustomerVehicles(abc.customerID) 
FROM  (SELECT DISTINCT CustomerID 
      FROM TABLE) abc 
ORDER BY abc.CustomerID 

然後,只需創建一個標量函數,將這些值合併到一個變量中並返回結果。