我有以下临时表(#associations):
create table #associations (ID1 nvarchar(max), ID2 nvarchar(max))
insert into #associations (ID1,ID2) values
(1,2)
,(1,3)
,(2,1)
,(2,3)
,(3,1)
,(3,2)
ID1 ID2
1 2
1 3
2 1
2 3
3 1
3 2
所有ID彼此相关,因此ID1和ID2中的关系偶尔会以相反的方向重复。
我需要做的是,在逗号分隔的列表中为任意数量的关系(在上面的示例中超过3个)选择一个完全唯一的结果集,如下所示:
ID Relationship
1 2,3
2 3
到目前为止,我有以下SQL,但它并没有变成独特的关系(即我在结果中涵盖了两个方向):
select distinct
a.id1 as [ID]
,stuff(
(
select ', ' + a2.id1
from #associations a2
where a2.id2 = a.id1
for xml path('')
), 1, 1, '') as [Relationship]
from #associations a
提前感谢您的帮助。
答案 0 :(得分:1)
您可以在与此相关的查询中添加其他检查,例如AND a.id1 > a2.id1
select distinct
a.id1 as [ID]
,stuff(
(
select ', ' + a2.id1
from #associations a2
where a2.id2 = a.id1
AND a.id1 > a2.id1
for xml path('')
), 1, 1, '') as [Relationship]
from #associations a
这会限制重复的关系。
您可能还需要在关联查询之前执行UNION
#associations
。
SELECT ID1, ID2 FROM #associations
UNION
SELECT ID2 AS ID1, ID1 as ID2 FROM #associations
并在您的查询中使用此项而不是#associations
答案 1 :(得分:1)
试试这个:
;with a as (
select distinct case when a.ID1 < a.ID2 then a.ID1 else a.ID2 end ID1
, case when a.ID1 < a.ID2 then a.ID2 else a.ID1 end ID2
from #associations a
)
select distinct a.ID1 as [ID]
, STUFF((select ', '+a2.ID2 from a a2 where a.ID1 = a2.ID1 for xml path('')),1,2,'') as [Relationship]
from a
如果ID1小于ID2,则使用ID1作为第一个id,ID2作为第二个id,否则交换ID1和ID2。