2016-07-28 20 views
3

Ich habe mehrere Tabellen mit einem Fremdschlüssel aus einer Haupttabelle. Die Tabellen sind wie folgt aus:So verketten Sie mehrere Zeilen effizient aus mehreren Tabellen

Schwestern

MainID IDNO .... 
111111  1 ....   
111111  1 ....   
111111  1 .... 
222222  1 ....   
111111  2 ....   

Brüder

MainID IDNO .... 
111111  555 ....   
111111  333 ....   
111111  111 .... 
222222  222 ....   
111111  321 ....   

Uncles

MainID IDNO .... 
111111  561 ....   
111111  121 ....   
111111  331 .... 
222222  451 ....   
111111  672 .... 

Ich muss concat enate alle IDNo s in, aber ich kann nicht scheinen alle wie zum Beispiel zu bekommen vielleicht kann ich nicht 672

SELECT 
    ',' + S1.IDNo + ',' + B1.IDNo + ',' + U1.IDNo AS [text()] 
FROM 
    Sisters S1, Brothers B1, Uncles U1, MainTable 
WHERE 
    D1.MainID = MainTable.ID 
    AND S1.MainID = MainTable.ID 
    AND B1.MainID = MainTable.ID 
FOR XML PATH('') 

Ich versuchte später zu trennen Tabellen und concanate aber es ist immer viel auf diese Weise langsamer. Was kann ich tun?

Erwartete Ausgabe:

,1,1,1,1,2,555,333,111,222,321,561,121,331,451,672 
+0

FYI : Haupttabelle hat ungefähr 200.000 Aufzeichnungen und die Untertabellen hat ungefähr 600.000 jeder. – jackjop

+5

[Schlechte Angewohnheiten zu treten: Verwenden von alten JOINs] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins. aspx) - diese alte * durch Kommas getrennte Liste von Tabellen * style wurde durch die * richtige * ANSI 'JOIN'-Syntax im ANSI - ** 92 ** SQL Standard ersetzt (** vor mehr als 20 Jahren **) und seine Verwendung wird davon abgeraten –

+0

@marc_s Ich verwendete Joins auch die Geschwindigkeit ist nicht zu viel bewirkt – jackjop

Antwort

1

Basierend auf dem erwarteten Ausgang scheint es, dass die MainID Spalte in jedem der drei Tabellen in der Ausgabe nichts zu sagen hat (wenn ja) arbeiten soll dies dann für Sie, obwohl ich nicht sicher bin, wird es skalieren, 600K + Datensätze zu behandeln. Aus Neugier, warum sollten Sie solch eine große Liste von Werten verketten?

Declare @x as varchar(max) = '' 

SELECT @x = @x + ',' + CAST(A.IDNO as varchar) FROM 
(
select 1 as IDNO UNION ALL 
select 2 as IDNO UNION ALL 
select 3 as IDNO UNION ALL 
select 4 as IDNO 
) A -- Pretend this is your Sisters tables 
FOR XML PATH('') 
PRINT @X -- Just for Debugging Purposes 

SELECT @x = @x + ',' + CAST(B.ID as varchar) FROM 
(
select 55 as IDNO UNION ALL 
select 66 as IDNO UNION ALL 
select 77 as IDNO UNION ALL 
select 88 as IDNO 
) B -- Pretend this is your Brothers tables 

PRINT @X -- Just for Debugging Purposes 

SELECT @x = @x + ',' + CAST(C.IDNO as varchar) FROM 
(
select 555 as IDNO UNION ALL 
select 666 as IDNO UNION ALL 
select 777 as IDNO UNION ALL 
select 888 as IDNO 
) C -- Pretend this is your Uncles tables 


PRINT @X -- Final Output 
SELECT @X as XML_Output FOR XML PATH('') 

Ausgang:

,1,2,3,4 
,1,2,3,4,55,66,77,88 
,1,2,3,4,55,66,77,88,555,666,777,888 -- Final Result 

<XML>,1,2,3,4,55,66,77,88,555,666,777,888</XML> -- XML Output 

Also in Ihrem Fall, dass Sie etwas tun könnten (Wieder nicht sicher, wie es bei großen Tabellen verhalten):

Declare @x as varchar(max) = '' 
SELECT @x = @x + ',' + CAST(A.IDNO as varchar) FROM 
(
select MainID , IDNO FROM SISTERS UNION ALL 
select MainID , IDNO FROM BROTHERS UNION ALL 
select MainID , IDNO FROM UNCLES 
) A 


SELECT @X as XML_Output FOR XML PATH('') 
+0

Nun, ich möchte diese Liste, weil der Client ein Hauptelement mit IDNOs aus Untertabellen suchen will. obwohl ich nicht weiß, ob es einen anderen Weg gibt, war das vernünftigste, was mir in den Sinn kam. Beispiel; Wenn der Client '555' in IDs sucht, sollte ich den Hauptartikel mit ID Nr. 111111 anzeigen, in Anbetracht der Situation in meiner Frage. – jackjop

Verwandte Themen