T-SQL查找对,其中至少有一个成员有两个或更多成员与不同成员

时间:2017-07-06 17:30:25

标签: sql sql-server tsql

我有一个包含两列的数据集:

source          target
Michael Scott   Kelly Kapoor
Jim Halpert     Pam Beasley
Jim Halpert     Pam Beasley
Dwight Schrute  Angela
Angela          Dwight Schrute
Erin            Meredith
Erin            Meredith
Kevin Malone    Stanley Hudson
Kevin Malone    Ryan Howard
Pam Beasley     Oscar

我想找到包含至少一个成员的行,这些成员具有至少两个不同成员的多对。因此,最终结果应该返回:

source          target          
Jim Halpert     Pam Beasley
Jim Halpert     Pam Beasley
Kevin Malone    Stanley Hudson
Kevin Malone    Ryan Howard
Pam Beasley     Oscar

Michael --> Kelly已删除,因为它们没有任何其他链接 Dwight Schrute --> AngelaAngela --> Dwight Schrute已删除,因为虽然有多个链接,但链接位于相同的成员之间。 Erin --> MeredithErin --> Meredith被删除了,因为链接又在同一个成员之间(尽管方向相同)。

我知道如何找到涉及相同成员的不同链接:

select source
      ,target
from dbo.networktest
group by source, target
having count(*) > 1
union
select b.source
      ,b.target
from dbo.networktest a
left outer join dbo.networktest b on a.source = b.target and a.target = b.source
where b.source is not null and b.target is not null

我如何更改(或废弃/重建)以实现我的目标?感谢您对所有人的见解!如果我能让我的问题更清楚,请告诉我。

1 个答案:

答案 0 :(得分:3)

我认为exists确实需要:

select nt.*
from networktest nt
where exists (select 1
              from networktest nt2
              where nt2.source in (nt.source, nt.target) and
                    nt2.target not in (nt.source, nt.target)
             ) or
      exists (select 1
              from networktest nt2
              where nt2.target in (nt.source, nt.target) and
                    nt2.source not in (nt.source, nt.target)
             );