如何有效地连接多个表中的多行

时间:2016-07-28 13:47:07

标签: sql sql-server concatenation for-xml-path

我有多个表和主表中的外键。表格如下:

姐妹

'System.NullReferenceException' occurred in ServiceStack.dll but was not handled in user code

兄弟

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

叔伯

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

我需要连接所有MainID IDNO .... 111111 561 .... 111111 121 .... 111111 331 .... 222222 451 .... 111111 672 .... 但我似乎无法获得所有内容,例如我可能无法获得672

IDNo

我试图将表分开并稍后使用,但这种方式变慢了。我该怎么办?

预期输出:

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('')

1 个答案:

答案 0 :(得分:1)

根据预期的输出,似乎3个表中每个表中的MainID列在输出中都没有说明(,如果是这样)那么这应该适合你,虽然我不确定它会扩展处理600K +记录。出于好奇,你为什么要连接如此庞大的值列表?

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('') 

输出

,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

所以在你的情况下,你可以做这样的事情(再次不确定它在大表上的表现)

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('')