[英]Querying hierarchical data through SQL
问题:
通过SQL查询分层数据以查询分支信息子集的不同方式。
案例分析 :
员工表:
desc employees
Name Null Type
-------------- -------- ------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
物业:
总裁是没有经理的员工,即空。
对于例如不进行任何管理的开发人员(例如,employee_id不在manager_id中),存在叶子节点。
有管理开发人员的第一线经理,管理第一线的第二线经理,等等.....
我可以从下面的所有经理查询:
SELECT manager_id,
employee_id
FROM EMPLOYEES o
WHERE EXISTS
(SELECT * FROM EMPLOYEES i WHERE o.employee_id = i.manager_id)
AND manager_id IS NOT NULL
ORDER BY o.manager_id,
o.EMPLOYEE_ID;
并从下面的总裁:
SELECT manager_id,
employee_id
FROM EMPLOYEES o
WHERE EXISTS
(SELECT * FROM EMPLOYEES i WHERE o.employee_id = i.manager_id)
AND manager_id IS NULL
ORDER BY o.manager_id,
o.EMPLOYEE_ID;
我应该如何通过exists
关键字来让二线经理?
我应该如何在不使用exists
情况下获得二线经理?
获取分层数据的不同方式是什么?
还有关于查询的性能。
这是一次即可获取所有内容的基本查询:
select employee_id, first_name, last_name,
case
when level = 1 then 'President'
when level = 2 then '1st line manager'
when level = 3 then '2nd line manager'
when connect_by_isleaf = 1 then 'Developer'
end as employee_type
from employees
start with manager_id is null
connect by prior employee_id = manager_id
在connect by
查询中可用的LEVEL
伪列定义到起点的距离(由start with
定义)。 总统的level = 1
如果只需要第二线经理,则可以在语句中简单添加where level = 3
。 要获得第一线经理,请使用where level = 2
在这里,我得到了二线经理,欢迎其他任何方式。谢谢。
SELECT secondline_managers.employee_id,
secondline_managers.manager_id
FROM employees secondline_managers
WHERE EXISTS
(SELECT firstline_managers_anonymous.employee_id
FROM
(SELECT firstline_managers.employee_id,
manager_id
FROM employees firstline_managers
WHERE EXISTS
(SELECT all_managers.managers
FROM
(SELECT o.employee_id AS managers
FROM employees o
WHERE EXISTS
(SELECT *
FROM employees i
WHERE o.employee_id=i.manager_id
AND i.manager_id IS NOT NULL
)
) all_managers
WHERE firstline_managers.employee_id=all_managers.managers
AND firstline_managers.manager_id IS NOT NULL
)
ORDER BY firstline_managers.employee_id
) firstline_managers_anonymous
WHERE firstline_managers_anonymous.manager_id=secondline_managers.employee_id
AND secondline_managers.manager_id IS NOT NULL
)
ORDER BY secondline_managers.employee_id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.