Во-первых, разве у вас нет обратных слов соединения?
ON e.empId = mgr.mgrId
не должно быть
ON e.mgrId = mgr.empId
Даже если у вас работает, таблица с именем "mgr" должна содержать запись с mgr.empId и mgr.name, чтобы она была понятна.
Во-вторых, мне не нравится присоединение к Имени.Вы должны преобразовать это в идентификаторы.(Кто-то выходит замуж, и в следующий раз вы узнаете, что у вас есть группа сирот ...) Я подозреваю, что эта таблица действительно не нужна.
В-третьих, тот факт, что 2 столбца в наборе результатов имеютто же имя (имя) может привести к проблемам позже - плохая практика, если ничего больше.
Это SQL, который я бы использовал:
SELECT emp.Name, '(none)' AS Manager
FROM Employee emp
WHERE NOT EXISTS (SELECT 1
FROM Employee mgr
WHERE mgr.empId = emp.mgrId)
UNION ALL
SELECT emp.Name, mgr.Name AS Manager
FROM Employee emp
JOIN Employee mgr ON emp.mgrId=mgr.empId
JOIN Name nm ON nm.name = mgr.Name
ORDER BY 1, 2
Не беспокойтесь, если это выглядит неэффективно,современный компилятор SQL в большинстве случаев заканчивается одним и тем же, независимо от того, как вы его пишете.
Но сначала я бы запустил этот SQL, чтобы посмотреть, есть ли у меня сотрудники, у которых нет записи в имени.Таблица и исправить их:
SELECT *
FROM Employee e
LEFT JOIN Name nm
ON nm.name = e.Name
WHERE nm.name is null