我试图打印所有没有下属的员工。
我一直在考虑树数据结构。实际上,大多数员工都有下属(这些被称为经理)。唯一没有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);
答案 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 );