2016-07-28 119 views
3

我有一个主表中的外键与多个表。该表是这样的:如何高效地连接多个表中的多行

姐妹

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 .... 

我需要Concat的enate所有IDNo在公司,但我似乎无法得到所有作为例子也许我不能让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('') 

我想以后单独的表和concanate却是越来越慢得多的方式。我能做什么?

预期输出:

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

FYI :维护有大约200.000条记录,并且每个子表有大约600.000条记录。 – jackjop

+5

[踢坏的习惯:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) - 在ANSI - ** 92 ** SQL标准(**超过20年前的**)中,旧式*逗号分隔的表*样式列表被替换为* proper * ANSI'JOIN'语法并且它的使用是不鼓励的 –

+0

@marc_s我也使用了连接,速度没有太大影响 – jackjop

回答

1

此基础上出现,在各3代表的MainID列在输出中没有发言权的预期输出(如果是这样),那么这应该工作你虽然Iam不确定它会扩展到处理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('') 
+0

好吧,我想这个列表,因为客户想要从子表中搜索IDNO的主项目。虽然我不知道是否有另一种方式,但我想到的最合理的是这个。例;如果客户在ID中搜索'555',我应该显示ID为111111的主项目,考虑到我的问题。 – jackjop