【问题标题】:SQL filter on multiple matches from joinSQL 过滤来自连接的多个匹配项
【发布时间】:2021-07-29 19:04:59
【问题描述】:

假设我有以下数据;

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 中执行此操作吗?怎么样?

【问题讨论】:

  • 样本表数据很好,但您也应该指定预期结果。
  • 我的预期结果是 John,正如我在最后一行所说的 :)
  • 这是描述结果,而不是指定结果。

标签: sql join filter where-clause


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多