SQL Select 其中包含 IN 列

SQL Select where column IN inclusive

我有两个table个人和技能。

Person:

    PersonID: AutoNumber
    PersonName: String

Skill:

    SkillID: AutoNumber
    SkillName: String

我有一个连接table:

PersonSkills

    PersonID: Number (FK to Person.PersonID)
    SkillID: Number  (FK to Skill.SkillID)

我在人物中有两行table

PersonID   PersonName
1          Bob
2          John

技能中四行table

SkillID    SkillName
1          English
2          French
3          Math
4          Science

并且连接 table 有

PersonID     SkillID
1            1             (Bob - English)
1            3             (Bob - Math)
1            4             (Bob - Science)
2            2             (John - French)
2            3             (John - Science)

我想获得所有拥有英语、数学和科学技能(包括)的人的列表。一个标准的select

SELECT Person.PersonName, Skill.SkillName
FROM   Person left outer join PersonSkills on Person.PersonID = 
PersonSkills.PersonID left outer join on Skills on PersonSkills.SkillID = 
Skills.SkillID
where Skill.SkillName in ('English','Math','Science')

将检索 Bob 和 John。

如何获得所有三种技能都存在的唯一结果?

按人汇总,然后断言每个匹配的人都具备所有技能:

SELECT p.PersonName
FROM Person p
INNER JOIN PersonSkills ps ON p.PersonID = ps.PersonID
INNER JOIN Skills s ON ps.SkillID = s.SkillID
WHERE s.SkillName IN ('English', 'Math', 'Science')
GROUP BY p.PersonName
HAVING COUNT(DISTINCT s.SkillName) = 3;

你需要 having 子句。此外,始终建议为您的 table 提供别名,而不是在列前使用整个 table 名称。

select 
  p.PersonName, 
  s.SkillName
from Person p
left outer join PersonSkills ps
on p.PersonID = ps.PersonID 
left outer join Skills s
on ps.SkillID = s.SkillID
where s.SkillName in ('English','Math','Science')
group by
  p.PersonName, s.SkillName
having count(distinct s.SkillName) = 3