繁体   English   中英

通过SQL查询分层数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM