I have two tables Person and Skill.
Person:
PersonID: AutoNumber
PersonName: String
Skill:
SkillID: AutoNumber
SkillName: String
I have a join table:
PersonSkills
PersonID: Number (FK to Person.PersonID)
SkillID: Number (FK to Skill.SkillID)
I have two rows in the Person table
PersonID PersonName 1 Bob 2 John
And Four rows in the Skill table
SkillID SkillName 1 English 2 French 3 Math 4 Science
And the Join table has
PersonID SkillID 1 1 (Bob - English) 1 3 (Bob - Math) 1 4 (Bob - Science) 2 2 (John - French) 2 3 (John - Science)
I want to get a list of all people that have English, Math and Science as a skill (inclusive). A standard 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')
will retrieve both Bob and John.
How do I get the only results where all three skills are present?
Advertisement
Answer
Aggregate by person and then assert that all skills be present for each matching person:
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;