查找是否存在多个交叉点

时间:2012-12-24 18:33:02

标签: sql sql-server-2008-r2

非常简单的问题,只是无法绕过它。
例如:
3桌。所有者< - > OwnerAnimal< - >动物

动物可以有多个所有者,所有者可以有多个动物 现在,给定一个特定的所有者,找到与给定所有者有共同动物的其他所有者。

我认为我们需要多次在同一个表上进行连接,如下所示:

select distinct  
o2.Owner_Id,   
o2.Name  
from Owner o  
left join OwnerAnimal  oa  
on o.Owner_Id = oa.Owner_Id   
left join OwnerAnimal oa2   
on oa.Animal_id = oa2.Animal_Id   
left join Owner o2   
on. oa2.Owner_Id = o2.Animal_Id   
Where o.Owner_Id = 100 and o2.Owner_Id <> 100 --To exclude current owner from the list

但我不确定这是否是一种正确的方法。

1 个答案:

答案 0 :(得分:2)

如果您想要动物的任何重叠,以下是我想到的方式:

select distinct ao.owner
from AnimalOwners ao
where ao.animal in (select animal from AnimalOwners ao1 and ao1.owner = 100) and
      ao.owner <> 100

您可以将其重写为联接,但in似乎更有意义。

如果你想要所有的动物都一样,那么你需要加入。

with a as (select distinct animal from AnimalOwners where ao.owner = 100)
select ao.owner
from AnimalOwners ao left outer join
     a
     on ao.animal = a.animal
where ao.owner <> 100
group by ao.owner
having count(disinct ao.animal) = (select count(*) from a) and
       count(*) = count(a.animal)

我们的想法是使用having子句进行集合比较。第一个子条款保证第二个所有者的动物数量与100的数量相同。第二个保证第二个所有者不拥有的动物不归原所有者所有。 left outer join保留所有动物。

使用distinct关键字适用于动物可能会为所有者出现两次的情况。目前还不清楚是否允许这样做。

如果您希望所有者拥有与原始所有者相同的动物,但可以拥有其他所有者,请在上一个查询中将left outer join更改为join