У меня есть две таблицы Employees
и Assignments
с содержимым, как показано на изображениях ниже (выход A и B соответственно). У каждого сотрудника в Employees
макс. 1 руководитель проекта (Assignment.A_Leader = 1
) и макс. Назначение 1 контролера проекта (Assignment.A_Controller = 1
). Я хочу получить список всех сотрудников тех проектов, которые они возглавляют или контролируют. Если такого назначения для сотрудника нет, должно появиться NULL
. Мне удается составить список назначений либо руководителя, либо проекта. Однако мне не удается собрать оба вместе в правильный список, как предлагается здесь (см. Попытку E). Что мне нужно добавить, чтобы получить желаемую финальную таблицу?
Буквы AE для кодов ниже соответствуют буквам AE для выходных данных на изображении.
Я использую Microsoft SQL Сервер 2017.
-- A: all employees
SELECT * FROM Employee
-- B: all assignments
SELECT * FROM Assignment
-- C: employees with their projects as LEADERS
SELECT E.E_FirstName as First, E.E_LastName as Last, L.A_ProjectID as Leader
FROM Employee E LEFT JOIN
(SELECT A.E_ID, A_ProjectID FROM Assignment A WHERE A.A_Leader=1) L
ON E.E_ID = L.E_ID
-- D: employees with their projects as CONTROLLERS
SELECT E.E_FirstName as First, E.E_LastName as Last, C.A_ProjectID as Controller
FROM Employee E LEFT JOIN
(SELECT A.E_ID, A_ProjectID FROM Assignment A WHERE A.A_Controller=1) C
ON E.E_ID = C.E_ID
-- E: employees with their projects as LEADERS or CONTROLLERS
SELECT X.First, X.Last, X.Leader, Y.Controller FROM
(SELECT E.E_FirstName as First, E.E_LastName as Last, L.A_ProjectID as Leader
FROM Employee E LEFT JOIN
(SELECT A.E_ID, A_ProjectID FROM Assignment A WHERE A.A_Leader=1) L
ON E.E_ID = L.E_ID) as X,
(SELECT E.E_FirstName as First, E.E_LastName as Last, C.A_ProjectID as Controller
FROM Employee E LEFT JOIN
(SELECT A.E_ID, A_ProjectID FROM Assignment A WHERE A.A_Controller=1) C
ON E.E_ID = C.E_ID) as Y