Простое самостоятельное соединение PostgreSQL

Вот как выглядит моя таблица 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...

http://sqlfiddle.com/#!17/6e6af/9

Да, это будет. Для 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, чтобы увидеть.

Adrian Klaver 25.12.2020 21:02
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
393
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

... Что действительно не вернет строк, как и следовало ожидать.

Я не знал, как именно работает оценка при присоединении...

kobayashi 25.12.2020 21:29

Вы делаете left join от e до m.

Когда совпадений нет, left join все равно возвращает строку. Каковы значения m в строке? Они NULL.

По соглашению SQL использует NULL для обозначения «отсутствующего совпадения во внешнем соединении» (но на самом деле альтернативного значения нет).

Итак, все столбцы для mm в строке для Венди Хейс будут NULL.

Другие вопросы по теме