Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何高效地连接多个表中的多行_Sql_Sql Server_Concatenation_For Xml Path - Fatal编程技术网

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

Sql 如何高效地连接多个表中的多行,sql,sql-server,concatenation,for-xml-path,Sql,Sql Server,Concatenation,For Xml Path,我有多个主表的外键表。表格如下所示: 姐妹 兄弟 叔叔 我需要将所有IDNos串联在一起,但我似乎无法获得所有,例如,可能无法获得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.MainI

我有多个主表的外键表。表格如下所示:

姐妹

兄弟

叔叔

我需要将所有
IDNo
s串联在一起,但我似乎无法获得所有,例如,可能无法获得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('')
后来我试着把桌子分开,然后再做凹面,但这样做的速度要慢得多。我能做什么

预期产出:


根据预期的输出,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

仅供参考:主表约有200000条记录,子表各约有60000条记录。-在ANSI-92 SQL标准(20多年前)中,旧式的逗号分隔的表列表样式被正确的ANSI
JOIN
语法所取代,并且它的使用非常简单discouraged@marc_s我也使用了连接。速度没有太大影响。可恢复,您希望
联合所有人
,但没有示例结果,这仅仅是猜测。这并不是关于速度,而是关于可读性和可维护性,以及避免意外的交叉连接(笛卡尔产品)……好吧,我想要这个列表,因为客户希望从子表中搜索带有idno的主项。虽然我不知道还有没有别的办法,但我想到的最合理的办法就是这个。例子;如果客户端搜索
555
在IDs中,我应该显示ID号为111111的主项,考虑到我问题中的情况。
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,1,1,1,2,555,333,111,222,321,561,121,331,451,672
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('')