SQL Выбрать, где столбец IN включительно - PullRequest
0 голосов
/ 09 июля 2020

У меня есть две таблицы Person и Skill.

Person:

    PersonID: AutoNumber
    PersonName: String

Skill:

    SkillID: AutoNumber
    SkillName: String

У меня есть таблица соединений:

PersonSkills

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

У меня две строки в таблице Person

PersonID   PersonName
1          Bob
2          John

И четыре строки в таблице навыков

SkillID    SkillName
1          English
2          French
3          Math
4          Science

И в таблице объединения есть

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

Я хочу получить список всех людей, у которых есть английский sh, математика и Наука как навык (включительно). Стандартный выбор

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')

вернет и Боба, и Джона.

Как мне получить только результаты, в которых присутствуют все три навыка?

Ответы [ 2 ]

1 голос
/ 09 июля 2020

вам понадобится having пункт. Также всегда рекомендуется давать псевдоним вашей таблице вместо использования полного имени таблицы перед столбцом.

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
1 голос
/ 09 июля 2020

Сгруппируйте по людям, а затем подтвердите, что все навыки присутствуют для каждого подходящего человека:

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;
...