Один оператор SQL, который находит одно значение на основе результатов другого значения - PullRequest
0 голосов
/ 01 мая 2019

Без использования подзапроса я пытаюсь найти менеджера определенного отдела, а затем менеджера этого менеджера отдела.Возможно ли это или требуется подзапрос?

SELECT M. EmployeeFirstName, M. EmployeeLastName
FROM EMPLOYEE_t M, EMPLOYEE_t E
WHERE E.ManagerID = M.EmployeeID
AND E.EmployeeJobTitle = 'Accountant'
GROUP BY M. EmployeeFirstName, M. EmployeeLastName

Этот предоставленный код возвращает менеджера отдела, но я не уверен, как найти менеджера этого менеджера отдела в одном операторе.

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Вот переписать ваш текущий запрос, который возвращает имя менеджера менеджера бухгалтеров, переписанное с использованием INNER JOIN (синтаксис ANSI-92)

SELECT 
    MM.EmployeeFirstName, 
    MM.EmployeeLastName
FROM EMPLOYEE_t M
INNER JOIN EMPLOYEE_t E
    ON E.ManagerID = M.EmployeeID
INNER JOIN EMPLOYEE_t MM
    ON M.ManagerId = MM.EmployeeID
WHERE E.EmployeeJobTitle = 'Accountant'
GROUP BY MM.EmployeeFirstName, MM.EmployeeLastName

Использование GROUP BY можно заменить ключевым словом DISTINCT в верхней части запроса, чтобы возвращать каждого менеджера только один раз, например,

SELECT DISTINCT
    MM.EmployeeFirstName, 
    MM.EmployeeLastName
FROM EMPLOYEE_t M
INNER JOIN EMPLOYEE_t E
    ON E.ManagerID = M.EmployeeID
INNER JOIN EMPLOYEE_t MM
    ON M.ManagerId = MM.EmployeeID
WHERE E.EmployeeJobTitle = 'Accountant'

Кроме того, если не у всех менеджеров бухгалтера есть менеджеры, вы можете вернуть имя менеджера самого высокого уровня, который вы можете найти. В этом случае вы можете использовать ISNULL() и LEFT JOIN для возврата правильного имени менеджера верхнего уровня, т.е.

SELECT DISTINCT
    ISNULL(MM.EmployeeFirstName, M.EmployeeFirstName) as EmployeeFirstName,
    ISNULL(MM.EmployeeLastName, M.EmployeeLastName) as EmployeeLastName
FROM EMPLOYEE_t M
INNER JOIN EMPLOYEE_t E
    ON E.ManagerID = M.EmployeeID
LEFT JOIN EMPLOYEE_t MM
    ON M.ManagerId = MM.EmployeeID
WHERE E.EmployeeJobTitle = 'Accountant'
0 голосов
/ 01 мая 2019

Просто продолжайте присоединяться Employee_t.Две другие вещи:

  1. Я не уверен, что вам нужна GROUP BY
  2. Используйте соединения ANSI-92
SELECT M.EmployeeFirstName
     , M.EmployeeLastName
     , M2.EmployeeFirstName AS ManagerFirstName
     , M2.EmployeeLastName  AS ManagerLastName
FROM EMPLOYEE_t E
JOIN EMPLOYEE_t M
  ON E.ManagerID = M.EmployeeID
JOIN EMPLOYEE_t M2
  ON M.ManagerID = M2.EmployeeID
WHERE E.EmployeeJobTitle = 'Accountant'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...