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