Нахождение идентификатора не в другом столбце - PullRequest
2 голосов
/ 16 октября 2019

Я работаю над небольшим упражнением по SQL и решаю эту проблему.

Я пытаюсь найти всех сотрудников, которым не подчиняется ни один другой сотрудник. Вот как выглядит таблица employees:

   EmployeeId   LastName    FirstName   Title                 ReportsTo
             1  Adams       Andrew      General Manager       null
             2  Edwards     Nancy       Sales Manager         1
             3  Peacock     Jane        Sales Support Agent   2
             4  Park        Margaret    Sales Support Agent   2
             5  Johnson     Steve       Sales Support Agent   2
             6  Mitchell    Michael     IT Manager            1
             7  King        Robert      IT Staff              6
             8  Callahan    Laura       IT Staff              6

Я думал, что простой из этих запросов сделает это:

SELECT *
FROM employees
Where EmployeeId not in (select ReportsTo from employees)


SELECT *
FROM employees
Where EmployeeId not in (ReportsTo)

Но они возвращают следующие результаты, которые неэто то, что я ищу:

EmployeeId  LastName    FirstName   Title                ReportsTo
         2  Edwards     Nancy       Sales Manager        1
         3  Peacock     Jane        Sales Support Agent  2
         4  Park        Margaret    Sales Support Agent  2
         5  Johnson     Steve       Sales Support Agent  2
         6  Mitchell    Michael     IT Manager           1
         7  King        Robert      IT Staff             6
         8  Callahan    Laura       IT Staff             6

Почему NOT IN возвращает элементы, которые определенно находятся в этом столбце? Как бы я мог возвратить товары, отсутствующие в ReportsTo, если я неправильно использую NOT IN?

Ответы [ 3 ]

4 голосов
/ 16 октября 2019

Используйте not exists с коррелированным подзапросом (как прокомментировал jarlh):

select *
from employees e
where not exists (
    select 1
    from employees e1 
    where e1.ReportsTo = e.EmployeeId   
)
3 голосов
/ 16 октября 2019

Проблема с вашим первым запросом состоит в том, что вы используете NOT IN со списком, который содержит значение NULL. Таким образом, сравнение EmployeeId, как, скажем, 5:

5 NOT IN (null, 1, 2, 6)

вернет NULL, потому что любое сравнение с NULL возвращает NULL и что EmployeeId не будет включено в результаты,Измените на:

SELECT *
FROM employees
Where EmployeeId not in (
  select ReportsTo 
  from employees 
  where ReportsTo is not null
);

См. Демоверсию . Результаты:

| EmployeeId | LastName | FirstName | Title               | ReportsTo |
| ---------- | -------- | --------- | ------------------- | --------- |
| 3          | Peacock  | Jane      | Sales Support Agent | 2         |
| 4          | Park     | Margaret  | Sales Support Agent | 2         |
| 5          | Johnson  | Steve     | Sales Support Agent | 2         |
| 7          | King     | Robert    | IT Staff            | 6         |
| 8          | Callahan | Laura     | IT Staff            | 6         |
0 голосов
/ 16 октября 2019

Вы можете просто использовать приведенный ниже запрос--

select * from employees emp where employeeID not in (select ReportsTo from employee)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...