SQL 过滤来自 join 的多个匹配项

SQL filter on multiple matches from join

假设我有以下数据;

Person
 1. John
 2. Anne
 3. Will
PersonAnimals
1 1
1 2
1 3
2 1
3 2
Animal
1. Cat
2. Dog
3. Fish

现在我可以这样查询所有数据了;

SELLECT *
FROM Person p
JOIN PersonAnimal pa ON pa.PersonId = p.Id
JOIN Animal a ON pa.AnimalId = a.Id;

但现在我想查询每个拥有猫 AND 狗的人。 (在示例中,只有 John 匹配该过滤器)您可以在 SQL 中执行此操作吗?怎么办?

聚合在这里可以提供帮助:

SELLECT p.*
FROM Person p JOIN
     PersonAnimal pa
     ON pa.PersonId = p.Id JOIN
     Animal a
     ON pa.AnimalId = a.Id
WHERE a.species IN ('cat', 'dog')
GROUP BY p.id
HAVING COUNT(DISTINCT a.species) = 2;  -- both are present

注意:在某些数据库中,您需要在 GROUP BY 中包含 SELECT 中的所有列。以上符合标准 SQL 假设 person.id 是主键(或唯一键)。