首页 > 解决方案 > SQL 过滤来自连接的多个匹配项

问题描述

假设我有以下数据;

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;

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

标签: sqljoinfilterwhere-clause

解决方案


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

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

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


推荐阅读