没有下属的员工

时间:2015-04-28 20:40:14

标签: sql oracle

我试图打印所有没有下属的员工。

enter image description here

我一直在考虑树数据结构。实际上,大多数员工都有下属(这些被称为经理)。唯一没有subordonates的人是叶子(他们没有孩子)。

但是,我不明白如何从这棵树中选择叶子。

--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);

4 个答案:

答案 0 :(得分: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 :(得分: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

过滤条件仅选择左表中右表中没有匹配行的那些行。

这比通过相关子查询进行过滤更为可取,因为后者可能需要为每个员工行单独执行子查询。 (如果查询规划器避免这种情况,则将其转换为外部联接的等效项。)

答案 2 :(得分: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)

答案 3 :(得分:0)

SELECT *
 FROM employees e
 WHERE e.employee_id NOT IN ( SELECT nvl(manager_id, 0)
                              FROM employees );