2017-02-02 5 views
1
TableA -- list of objects 
-------- 
Rec1 
Rec2 
Rec3 

TableB -- list of TONS of details A->B = 1->MMM 
-------- 
Rec1, data..., String1 
Rec1, data..., String1 
Rec1, data..., String1 
Rec1, data..., String2 
Rec2, data..., String1 
Rec2, data..., String1 
Rec3, data..., String1 
Rec3, data..., String1 
Rec3, data..., String2 
Rec3, data..., String2 
Rec3, data..., String3 

Eine Abfrage reduziert Tabelle B auf eine viel kleinere Anzahl von Datensätzen durch einige Details Schneiden, so dass eine 1-> Msauberen Code vs Haufen Temptabellen

QueryResult 
------------ 
Rec1, String1 
Rec1, String2 
Rec2, String1 
Rec3, String1 
Rec3, String2 
Rec3, String3 

Versuch

Final 
--------- 
Rec1, String1 + String2 
Rec2, String1 
Rec3, String1 + String2 + String3 
zu bauen

Ich habe versucht, Spalten für jeden einzelnen String hinzufügen, packen die Zeichenfolgen in angemessen und verketten dann die einzelnen Zeichenfolgen in einer Übersichtsspalte. Während das funktioniert, sieht es hässlich aus und erinnert daran, nur einen Hammer in meiner Werkzeugkiste zu haben.

Gibt es eine elegantere Lösung mit anderen Werkzeugen als meinem großen Hammer?

Kommentare und Einblicke würden sehr geschätzt werden. Danke!

+0

Ihre Frage ist unklar. Bitte präzisieren Sie, was Sie erreichen wollen und was Sie getan haben. – tonythewest

+0

Danke für das Springen in Tony West. Iamdave hat es in einem geschafft. –

Antwort

2

Sie können dies tun, mit for xml, Ihrem ursprünglichen TableA auf Ihren Beitritt QueryResult:

declare @TableA table(TableA nvarchar(10)); 
insert into @TableA values('Rec1'),('Rec2'),('Rec3'); 

declare @QueryResult table(TableA nvarchar(10),TableB nvarchar(10)); 
insert into @QueryResult values('Rec1','String1'),('Rec1','String2'),('Rec2','String1'),('Rec3','String1'),('Rec3','String2'),('Rec3','String3'); 


select TableA 
     ,stuff((select ', ' + TableB -- The ', ' is the delimiter. The first instance of this is removed by the STUFF function. 
       from @QueryResult t2 
       where t1.TableA = t2.TableA 
       order by t2.TableB 
       for xml path('') 
       ) 
       ,1,2,''     -- This is where you specify how much from the start to remove. 
      ) as TableB 
from @TableA t1; 

Ausgang:

+--------+---------------------------+ 
| TableA |   TableB   | 
+--------+---------------------------+ 
| Rec1 | String1, String2   | 
| Rec2 | String1     | 
| Rec3 | String1, String2, String3 | 
+--------+---------------------------+ 

Die stuff Funktion startet bei den n-ten Zeichen wie in Ihrem ersten Parameterwert angegeben (in diesem Fall 1) und ersetzt es und alles bis zu dem Zeichen in der zweiten Parameterposition (in diesem Fall Zeichen 2) mit y unser dritter Parameterwert (in diesem Fall eine leere Zeichenfolge '').

Dies bedeutet, dass der normale heraus setzte der for xml Aussage über , String1, String2 für Rec1 sein würde, aber nach dem stuff die ersten beiden Zeichen angewendet wird, werden mit einem leeren String ersetzt, so String, String2` Ergebnisse.

+0

Sie haben mich durch Sekunden geschlagen :-) +1 – Shnugo

+0

Ziehen Sie Ihren Finger aus Shnugs – iamdave

+0

@iamdave Danke. Nach Altersgruppen für vorherige Fragen gesucht, gepostet und thennn lange Diskussionen zu diesem Thema gefunden. Schätzen Sie Ihre kurze und süße Lösung. –