1

非常に単純な質問です。頭を包むことはできません。
例:
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

しかし、これが正しいアプローチであるかどうかはわかりません。

4

1 に答える 1

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アイデアは、句を使用してセット比較を行うことです。最初の節は、2番目の所有者の動物の数が100の数と同じであることを保証します。2番目の節は、元の所有者が所有していない2番目の所有者が所有する動物がいないことを保証します。はすべてのleft outer join動物を飼っています。

キーワードの使用はdistinct、飼い主に動物が2回現れる可能性がある状況での使用です。これが許可されているかどうかは不明です。

元の所有者と同じ動物を所有しているが、他の動物を所有できる所有者が必要な場合は、前のクエリでをに変更left outer joinします。join

于 2012-12-24T18:37:19.657 に答える