MSSQL 2008:从多对多表中获取唯一值

时间:2015-06-03 12:30:16

标签: sql sql-server sql-server-2008

我有以下临时表(#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

提前感谢您的帮助。

2 个答案:

答案 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。