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
是主键(或唯一键)。
假设我有以下数据;
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
是主键(或唯一键)。