Вот как выглядит моя таблица employee
, где manager_id
является внешним ключом к той же таблице, на которую он ссылается employee_id
, и указывает, у какого сотрудника есть менеджер, а у кого есть.
employee_id | first_name | last_name | manager_id
-------------+------------+-------------+------------
1 | Windy | Hays |
2 | Ava | Christensen | 1
3 | Hassan | Conner | 1
4 | Anna | Reeves | 2
5 | Sau | Norman | 2
6 | Kelsie | Hays | 3
7 | Tory | Goff | 3
8 | Salley | Lester | 3
Я сделал self left join, и результат был ожидаемым.
SELECT
e.first_name || ' ' || e.last_name AS employee,
m.first_name || ' ' || m.last_name AS manager
FROM
employee e
LEFT JOIN employee m ON m.employee_id = e.manager_id;
employee | manager
-----------------+-----------------
Windy Hays |
Ava Christensen | Windy Hays
Hassan Conner | Windy Hays
Anna Reeves | Ava Christensen
Sau Norman | Ava Christensen
Kelsie Hays | Hassan Conner
Tory Goff | Hassan Conner
Salley Lester | Hassan Conner
(8 rows)
Но этот запрос дает мне
SELECT
e.first_name || ' ' || e.last_name AS employee,
m.first_name || ' ' || m.last_name AS manager
FROM
employee e
LEFT JOIN employee m ON m.employee_id = e.manager_id;
WHERE m.employee_id IS NULL;
employee | manager
------------+---------
Windy Hays |
(1 row)
Поэтому я не понимаю, почему он возвращает что-то вместо ничего.employee_id никогда не будет NULL...
employee_id никогда не будет NULL...
Значение null
происходит из столбца e.manager_id
(а не из столбца m.employee_id
) — это Windy Hays, главный сотрудник в иерархическом дереве.
Для этой конкретной строки left join
, который пытается получить соответствующий менеджер, не находит совпадения, поэтому теперь m.employee_id
есть null
в наборе результатов.
Возможно, предложение where
, которое вы хотели написать, это:
WHERE e.employee_id IS NULL
... Что действительно не вернет строк, как и следовало ожидать.
Я не знал, как именно работает оценка при присоединении...
Вы делаете left join
от e
до m
.
Когда совпадений нет, left join
все равно возвращает строку. Каковы значения m
в строке? Они NULL
.
По соглашению SQL использует NULL
для обозначения «отсутствующего совпадения во внешнем соединении» (но на самом деле альтернативного значения нет).
Итак, все столбцы для m
m в строке для Венди Хейс будут NULL
.
Да, это будет. Для Windy Hays вы делаете
LEFT JOIN
наe.manager_id
, чтоNULL
. Поскольку этоNULL
и нетm.employee_id
, который соответствует, он вернет значенияNULL
для m 'table'. Тест наe.employee_id
. Запустите скрипку безWHERE
и вернитеe.employee_id
иm.employee_id
, чтобы увидеть.