2017-04-24 2 views
0

Ich arbeite derzeit an einer Abfrage in T-SQL auf SQL Server 2012. Ich sammle mehrere Titel aus einer Tabelle über eine Verknüpfung von einer anderen Tabelle. Meine Tabellen wie folgt aussehen:T-SQL Concat 2 Zeilen mit derselben ID von Join

Tabelle Projekt:

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

Tabelle ProjectResources

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

die gewünschte Ausgabe in meiner temporären Tabelle sollte wie folgt aussehen:

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

Ich möchte alle Labels concattieren mit derselben ProjectId. Meine aktuelle Abfrage sieht wie folgt aus:

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 

Leider erstellt meine Abfrage eine neue Zeile für jedes Resouce Label. Wissen Sie, wie Sie eine neue temporäre Tabelle mit "verknüpften" zusammengeführten Zeilen für jede Ressource erstellen, die dieselbe ProjectId enthält?

Vielen Dank!

+0

, keine Zeilen Sie fragen, wie man verketten Spalten nutzen könnten. Es gibt verschiedene Techniken, die in [Gruppierte Verkettung in SQL Server] (https://sqlperformance.com/2014/08/t-sql-queries/sql-server-grouped-concatenation) von Aaron Bertrand beschrieben und verglichen werden. Die schnellste Technik verwendet SQLCLR, das zweitschnellste XML. 'STRING_AGG' wird nativ unterstützt in der nächsten Version von SQL Server, SQL Server 2017 –

Antwort

2

Sie For xml path, stuff wie diese

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

Vielen Dank für Ihre Hilfe und den guten Hinweis, ich habe einige Nachforschungen gemacht und scheinbar für Xml Pfad ist eine sehr schnelle Lösung für dieses häufige Problem. :) – TimHorton

+0

Sie sind willkommen ... – 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

Eine Code-only-Antwort wird nicht als eine gute Antwort angesehen. Bitte erklären Sie * warum * dieser Code beantwortet die Frage. Dies ist nur eine der verfügbaren Techniken, um Strings zu aggregieren, und es ist nicht einmal die schnellste –

Verwandte Themen