2014-04-08 58 views
1

问题:通过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)  

物业:

总统是谁没有经理即空雇员。

对于例如不管理manager_id中的employee_id都不管理的开发者,有叶子节点。

有1RST直线经理谁管理,开发,二线经理谁管理1RST线等.....

我可以全部从下面查询经理:

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

获取分层数据的不同方式有哪些?

而且还关于查询的性能。

+2

看看'connect by' –

+0

非常感谢,我将使用它。任何其他方式,我们可以实现相同的。 – Curious

+0

https://stackoverflow.com/questions/tagged/recursive-query+oracle –

回答

0

在这里,我得到了第二线经理,任何其他方式welcome.Thanks。

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; 
+0

分层问题的好解决方案。 http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm#i2060615 – Curious

1

这是一次过得到的一切基本查询:

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