Как определить, является ли сотрудник менеджером?


Используя таблицу EMP, где менеджер представляет менеджера сотрудника:

EMPLOYEE   MANAGER
1          NULL
2          1
3          1
4          2
5          2

Как я могу сделать запрос, который определяет, является ли сотрудник менеджером?

EMPLOYEE   STATUS
1          IS MANAGER
2          IS MANAGER
3          IS NOT MANAGER
4          IS NOT MANAGER
5          IS NOT MANAGER

Можно ли это сделать без подзапроса?

3 3
sql

3 ответа:

Вы можете JOIN таблицу на себя и использовать CASE оператор:

SELECT DISTINCT E.Employee, 
    CASE 
       WHEN M.Employee IS NOT NULL THEN 'IS MANAGER' 
       ELSE 'IS NOT MANAGER' END Status
FROM YourTable E
   LEFT JOIN YourTable M ON E.Employee = M.Manager

Используйте OUTER JOIN, чтобы получить всех сотрудников, а не только тех, которые являются менеджерами.

Короткий ответ-нет. Учитывая структуру, которую вы показываете, нет никакого способа показать, что без соединения / подзапроса / CTE вы могли бы знать, является ли человек вершиной цепочки с:

SELECT *
FROM EMP 
WHERE MANAGER IS NULL

Но помимо этого вам нужен join/subquery/CTE.

Чтобы получить список первичных ключей менеджера, просто

SELECT DISTINCT
    MANAGER
FROM 
    EMP;

Чтобы получить дополнительную информацию о каждом менеджере, предположим, что в таблице также есть такие вещи, как имя менеджера:

SELECT DISTINCT
    m.employee, m.given_name, m.surname
FROM
    EMP m
JOIN
    EMP e
ON
    e.manager = m.employee;
Я изначально опустил идентификатор менеджера, но я отредактировал его, чтобы добавить его на тот случай, если в организации есть два менеджера с одинаковым именем: скажем, Джон Смит.

Если вы хотите получить сообщение о состоянии, вы можете использовать вызов обращения.

SELECT
    MANAGER,
    CASE COUNT(*)
        WHEN 0 THEN "IS NOT MANAGER"
        ELSE "IS MANAGER"
    END "STATUS"
FROM
    EMP
GROUP BY
    MANAGER;