2015-04-28 3 views
0

Я пытаюсь напечатать всех сотрудников, у которых нет подчиненных.Сотрудники без подчиненных

enter image description here

Я думал о структуре данных дерева. Практически большинство сотрудников имеют подчиненных (их называют менеджерами). Единственные без подчиненных - листья (у них нет детей).

Однако я не понимаю, как я могу выбрать листья из этого дерева.

--following prints employees without manager. 
    SELECT e.employee_id, e.last_name, e.first_name 
    FROM employees e 
    WHERE e.employee_id = (SELECT employee_id FROM employees WHERE manager_id IS NULL AND employee_id = e.employee_id); 
+0

используйте [connect by previous] (http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm) и проверьте статус листового узла. [Псевдоконкурс CONNECT_BY_ISLEAF возвращает 1, если текущая строка является листом дерева, определяемым условием CONNECT BY. В противном случае он возвращает 0. Эта информация указывает, может ли данная строка быть дополнительно расширена, чтобы отобразить больше иерархии.] (Http://docs.oracle.com/cd/B12037_01/server.101/b10759/pseudocolumns001.htm#i1007332) – xQbert

+0

Возможный дубликат [получить ВСЕ дети последнего уровня (листья) от узла (иерархические запросы Oracle 11G)] (http://stackoverflow.com/questions/21671568/get-all-last-level-children-leafs-from -a-узловой-hierarhical-запросы-оракул-11g) – xQbert

ответ

3

Короче говоря, вы хотите, чтобы выбрать всех сотрудников, которые не действуют в качестве менеджеров для других сотрудников. Это означает, что вы хотите выбрать таких сотрудников, employee_id не используется как manager_id для любого другого сотрудника.

Попробуйте это:

SELECT * 
    FROM employees e 
WHERE NOT EXISTS (SELECT 1 
        FROM employees e2 
        WHERE e2.manager_id = e.employee_id) 
1

Вы можете сделать это с помощью внешнего соединения:

SELECT e.employee_id, e.last_name, e.first_name 
FROM 
    employees e 
    LEFT JOIN employees sub 
    ON e.employee_id = sub.manager_id 
WHERE sub.manager_id IS NULL 

условие фильтра выбирает только те строки из левой таблицы, которые не имеют соответствующих строк в таблице справа ,

Это предпочтительнее для фильтрации через коррелированный подзапрос, поскольку последний может потребовать выполнения подзапроса отдельно для каждой отдельной строки сотрудника. (Если планировщик запросов позволяет избежать этого, это будет путем преобразования его в эквивалент внешнего соединения.)

0
SELECT e.employee_ID, e.last_name, e.First_name, CONNECT_BY_ISLEAF "IsLeaf", 
    LEVEL, SYS_CONNECT_BY_PATH(e.employee_ID, '/') "Path" 
    FROM employees e 
    CONNECT BY PRIOR E.employeeID = E.Manager_ID; 
    where isLeaf =1 

В основном украден из справки документы: http://docs.oracle.com/cd/B12037_01/server.101/b10759/pseudocolumns001.htm#i1007332

или другой стек вопрос: get ALL last level children (leafs) from a node (hierarhical queries Oracle 11G)

Смежные вопросы