非常简单的问题,只是无法绕过它。
例如:
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
但我不确定这是否是一种正确的方法。
答案 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
。