SQL: выбор из нескольких JOINS в разных подзапросах - PullRequest
1 голос
/ 05 мая 2020

У меня есть две таблицы 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

enter image description here

1 Ответ

3 голосов
/ 05 мая 2020

Вы можете просто left join таблицу assignments дважды:

select
    e.e_first_name,
    e.e_last_name,
    al.a_project_id leader,
    ac.a_project_id controller
from employee e
left join assignments al on al.e_id = e.e_id and al.a_leader     = 1
left join assignments ac on ac.e_id = e.e_id and ac.a_controller = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...