Используйте NOT EXISTS по идентификатору отдела: он вернёт сотрудников и с NULL, и с отсутствующим отделом. При корректно действующем внешнем ключе второй случай невозможен.
Сотрудники без привязанного отдела
Используйте NOT EXISTS по идентификатору отдела: он вернёт сотрудников и с NULL, и с отсутствующим отделом. При корректно действующем внешнем ключе второй случай невозможен.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо отобрать всех сотрудников, у которых поле department_id пустое либо значение в этом поле не найдено в таблице departments.
CREATE TABLE departments (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(id)
);
Ответ
Используйте NOT EXISTS по идентификатору отдела: он вернёт сотрудников и с NULL, и с отсутствующим отделом. При корректно действующем внешнем ключе второй случай невозможен.
SELECT e.id, e.name, e.department_id
FROM employees e
WHERE NOT EXISTS (
SELECT 1 FROM departments d WHERE d.id = e.department_id
);
Сравнение с NULL не находит строку, поэтому сотрудники без назначенного отдела также попадут в результат. При гарантированной целостности из DDL достаточно WHERE department_id IS NULL. Проверка отсутствующего ненулевого ID полезна для наследованных данных или отключённых ограничений; нарушить валидный внешний ключ обычной записью нельзя.