Кажется, что это работает:
SELECT
Dept.id,
Dept.name,
Dept.manager_id,
Employee.name AS manager_name
FROM
(SELECT *, NULL AS manager_id FROM Department) AS Dept
LEFT OUTER JOIN Employee
ON Dept.manager_id = Employee.id;
Если столбец manager_id
присутствует в Department
, тогда он используется для объединения, тогда как если нет, то Dept.manager_id
и Employee.name
оба равны NULL.
Если я поменяю местами порядок столбцов в подзапросе:
(SELECT NULL AS manager_id, * FROM Department) AS Dept
, тогда Dept.manager_id
и Employee.name
равны NULL, даже если существует столбец Department.manager_id
, так что, похоже, Dept.manager_id
относится к столбцу first в подзапросе Dept
с таким именем. Было бы хорошо найти в документации по SQLite ссылку, в которой говорится, что это поведение гарантировано (или явно сказано, что это не так), но я ничего не могу найти (например, в SELECT
или выражение страницы).
Я не пробовал этого с другими системами баз данных, поэтому я не знаю, будет ли он работать с чем-либо, кроме SQLite.