Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle中的员工经理层次结构查询_Sql_Oracle_Hierarchical Data_Hierarchical Query - Fatal编程技术网

Sql Oracle中的员工经理层次结构查询

Sql Oracle中的员工经理层次结构查询,sql,oracle,hierarchical-data,hierarchical-query,Sql,Oracle,Hierarchical Data,Hierarchical Query,我有一张结构如下的表格: +-------+-------+ | EMPID | MGRID | +-------+-------+ | A | B | | B | C | | C | D | | I | J | | J | D | | K | L | | L | O | | O | D | +-------+-------+ +-------+-------+ |EM

我有一张结构如下的表格:

+-------+-------+ | EMPID | MGRID | +-------+-------+ | A | B | | B | C | | C | D | | I | J | | J | D | | K | L | | L | O | | O | D | +-------+-------+ +-------+-------+ |EMPID | MGRID| +-------+-------+ |A | B| |B|C| |C|D| |I|J| |J|D| |基尔| |L|O| |O|D| +-------+-------+ 我想构建一个查询,可以创建一个视图,如下所示,将所有管理器层次结构显示为以最高管理器开头的列,但是我不确定如何在oracle中实现这一点。有人能帮我建议一下怎么做吗

所需输出:

+-------+-------+------+------+------+ | EMPID | MGRID | LVL1 | LVL2 | LVL3 | +-------+-------+------+------+------+ | A | B | D | C | B | | B | C | D | C | | | C | D | D | | | | I | J | D | J | | | J | D | D | | | | K | L | D | O | L | | L | O | D | O | | | O | D | D | | | +-------+-------+------+------+------+ +-------+-------+------+------+------+ |EMPID |经理|一级|二级|三级| +-------+-------+------+------+------+ |A | B | D | C | B| |B | C | D | C || |C | D | D || |我| J | D | J || |J | D | D || |K | L | D | O | L| |L|O|D|O|| |O | D | D || +-------+-------+------+------+------+
注意:我不知道如何将表格添加到问题中,但将其添加为文本以便可以复制。

您可以使用包含其相关函数的分层查询,例如
SYS\u CONNECT\u BY\u PATH()
SYS\u CONNECT\u BY\u PATH()
,包括条件聚合:

WITH emp2 AS
(
 SELECT empid, mgrid, 
        MAX( LENGTH(SYS_CONNECT_BY_PATH(empid, '|'))/2 + 1 ) 
             OVER ( PARTITION BY empid , mgrid ) AS max_lvl, 
        level AS lvl, CONNECT_BY_ROOT(mgrid) AS member
   FROM emp
CONNECT BY PRIOR empid = mgrid
)
SELECT empid, mgrid, 
       MAX( CASE WHEN max_lvl - lvl = 1 THEN member END ) AS LVL1,
       MAX( CASE WHEN max_lvl - lvl = 2 THEN member END ) AS LVL2,
       MAX( CASE WHEN max_lvl - lvl = 3 THEN member END ) AS LVL3
  FROM emp2
 GROUP BY empid, mgrid 
 ORDER BY empid, mgrid;

+-------+-------+------+------+------+
| EMPID | MGRID | LVL1 | LVL2 | LVL3 |
+-------+-------+------+------+------+
| A     | B     | D    | C    | B    |
| B     | C     | D    | C    |      |
| C     | D     | D    |      |      |
| I     | J     | D    | J    |      |
| J     | D     | D    |      |      |
| K     | L     | D    | O    | L    |
| L     | O     | D    | O    |      |
| O     | D     | D    |      |      |
+-------+-------+------+------+------+

看起来您希望在此处进行自联接(即将表联接到自身):
select。。。从emp e left outer在mgr1.empid=e.mgrid…
上加入emp mgr1。请不要将图像用于输入或输出数据样本,而应使用文本数据。