Найти и вернуть бывшего сотрудника, но не текущий - PullRequest
1 голос
/ 13 мая 2019

С учетом следующих таблиц:

Staff
+------------+--------+
| employeeID |  name  |
+------------+--------+
|     100100 | Kelly  |
|     101010 | John   |
|     222222 | Stuart |
+------------+--------+

Academics
+------------+----------+
| employeeID | degreeID |
+------------+----------+
|     100100 | PhD      |
|     101010 | Eng      |
|     222222 | Sci      |
+------------+----------+

Class
+------------+-----------+-----------+
| employeeID | studentID | subjectID |
+------------+-----------+-----------+
|     100100 |       998 | BUS_18_2  |
|     100100 |       921 | BUS_18_2  |
|     100100 |       901 | BUS_18_2  |
|     100100 |       934 | BUS_19_1  |
|     100100 |       964 | BUS_19_2  |
|     100100 |       934 | LED_19_1  |
|     100100 |       964 | LED_19_2  |
|     101010 |       901 | COE_19_2  |
|     101010 |       874 | COE_19_2  |
|     101010 |       823 | COE_19_2  |
|     222222 |       212 | FTR_17_2  |
|     222222 |       102 | FTR_17_1  |
|     222222 |       684 | FTR_18_1  |
+------------+-----------+-----------+

Вернуть список имен и степеней всех сотрудников, не прошедших обучение в 2019 году

Я пробовал различные методы построения вложенных операторов, чтобы определить, работал ли сотрудник несколько лет (основываясь на подсчете subjectID), но это более или менее жестко закодировано, и новые записи могут испортить такой метод ( как видно из примера).

Ожидаемый результат

+------------+------------+
|    name    | degreecode |
+------------+------------+
|   stuart   | sci        |
+------------+------------+

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Основная идея - not exists.Однако в вашей модели данных, по-видимому, отсутствует информация о том, какие классы предлагаются в 2019 году. Предполагается, что class содержит эту информацию:

select s.name, a.degreeid 
from staff s join
     academics a
     on s.employeeid = a.employeeid
where not exists (select 1
                  from class c
                  where c.employeeid = s.employeeid and
                        c.year = 2019
                 );
0 голосов
/ 13 мая 2019

Использовать коррелированный подзапрос с not exists

select distinct name, degreeid 
from staff a join academics b on a.employeeid=b.employeeid
join class c on a.employeeid=c.employeeid
where not exists 
   (select 1 from class c1 where c.employeeid=c1.employeeid and subjectID like '%_19%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...