2017-04-24 53 views
0

我目前正在SQL Server 2012上的T-SQL中進行查詢。我通過另一個表中的連接從表中收集多個標題。我的表是這樣的:T-SQL Concat 2具有相同Id的行從連接

表項目:

ProjectId | 
-----------+ 
1   | 
2   | 
3   | 

表ProjectResources

ResourceId | Label  | ProjectId 
-----------+---------------+----------- 
2   | Resource X | 1 
3   | Resource Y | 1 
4   | Resource Z | 2 
5   | Resource A | 2 
6   | Resource X | 3 

期望在我的臨時表輸出應該是這樣的:

ProjectId | Label     | 
-----------+--------------------------+ 
1   | Resource X, Resource Y | 
2   | Resource Z, Resource A | 
3   | Resource X    | 

我想要連接所有標籤使用相同的ProjectId。我目前的查詢是這樣的:

CREATE TABLE #tmpProjects 
(
    ProjectId INT 
    , Label VARCHAR(1000) 
) 

SELECT [P].ProjectId, [PR].Label 
    INTO #tmpProjects 
FROM [MySchema].[ProjectResources] [PR] 
INNER JOIN dbo.Project [P] ON [P].ProjectId= [PR].ProjectId 

不幸的是我的查詢爲每個Resouce標籤創建一個新行。你知道如何爲每個擁有相同ProjectId的資源創建一個具有「concatinated」合併行的新臨時表嗎?

非常感謝!

+0

你問如何連接列,不能行。 Aaron Bertrand在[SQL Server中的分組連接](https://sqlperformance.com/2014/08/t-sql-queries/sql-server-grouped-concatenation)中描述和測試了各種技術。最快的技術使用SQLCLR,第二快的XML。 'STRING_AGG'將在下一版本的SQL Server中本地支持,SQL Server 2017 –

回答

2

您可以使用For xml path, stuff這樣

SELECT p.ProjectId, 
    STUFF(( SELECT ', ' + pr.Label 
      FROM ProjectResources pr 
      WHERE pr.ProjectId = p.ProjectId FOR XML PATH('') 
      ) 
     ,1,2,'') as Label 
FROM Project p 
+0

感謝您的幫助和良好的提示,我做了一些研究,顯然對於這個常見問題,Xml路徑是一個非常快速的解決方案。 :) – TimHorton

+0

不客氣... – TriV

2
CREATE TABLE #Table2 
    ([ResourceId] int, [Label] varchar(10), [ProjectId] int) 
INSERT INTO #Table2 
    ([ResourceId], [Label], [ProjectId]) 
VALUES 
    (2, 'Resource X', 1), 
    (3, 'Resource Y', 1), 
    (4, 'Resource Z', 2), 
    (5, 'Resource A', 2), 
    (6, 'Resource X', 3) 
SELECT p.ProjectId, 
    STUFF(( SELECT ', ' + pr.Label 
      FROM (select a.ProjectId,ResourceId,Label from #Table1 A join #Table2 B on a.ProjectId=b.ProjectId) pr 
      WHERE pr.ProjectId = p.ProjectId FOR XML PATH('') 
      ) 
     ,1,2,'') as Label 
FROM (select a.ProjectId,ResourceId,Label from #Table1 A join #Table2 B on a.ProjectId=b.ProjectId) p 
group by p.ProjectId 

output 

ProjectId | Label     | 
-----------+--------------------------+ 
1   | Resource X, Resource Y | 
2   | Resource Z, Resource A | 
3   | Resource X    | 
+0

只有代碼答案不被視爲一個好答案。請解釋*爲什麼*此代碼回答這個問題。這只是可用於聚合字符串的技術之一,它甚至不是最快的 –