在Oracle中扩展父子层次结构记录以显示父记录的根记录

时间:2018-08-09 09:41:37

标签: oracle plsql

这是我的数据:

SalesEmp SalesMgr Trty
  002      009     1
  002      009     2
  003      009     3
  009      010     9
  010    (null)   10

我能够使用Oracle层次结构(CONNECT_BY_ROOT和PRIOR)创建层次结构,并获得如下所示的输出并将其存储在表中(例如T1):

SalesEmp Trty LVL
   002    1    1
   002    2    1
   003    3    1
   009    1    2
   009    2    2
   009    3    2
   009    9    2
   010    1    3
   010    2    3
   010    3    3
   010    9    2
   010    10   1

为了进一步处理应用程序中的记录,我希望知道子记录mgr源自其领域。像:-

SalesEmp Trty LVL Child_Record
   002    1    1     (null)
   002    2    1     (null)
   003    3    1     (null)
   009    1    2      002
   009    2    2      002
   009    3    2      003
   009    9    1      (null)
   010    1    3      002
   010    2    3      002
   010    3    3      003
   010    9    2      009
   010    10   1      (null)

我该如何实现?

2 个答案:

答案 0 :(得分:0)

我相信这会为您提供帮助-您可以将原始表左联接到层次结构查询中,将其TRTY和查询的SalesEmp连接到原始表的SalesMng:

SELECT your_query.salesemp,
       your_query.trty, 
       your_query.lvl, 
       orig_table.salesemp
  FROM your_query
  LEFT JOIN orig_table ON (orig_table.salesmgr = your_query.salesemp AND orig_table.trty = your_query.trty)
 ORDER BY your_query.salesemp, your_query.trty, your_query.lvl, orig_table.salesemp

答案 1 :(得分:0)

看起来您只需要添加prior emp作为选定列:

-- sample data
with t(emp, mgr, trty) as (
    select '002', '009', 1 from dual union all
    select '002', '009', 2 from dual union all
    select '003', '009', 3 from dual union all
    select '009', null,  9 from dual )
-- end of sample data
select emp, connect_by_root(trty) trty, level, prior emp as child
  from t connect by emp = prior mgr
  order by level, emp, trty, prior emp 

结果:

EMP       TRTY      LEVEL CHILD
--- ---------- ---------- -----
002          1          1 
002          2          1 
003          3          1        -- missing in your output
009          9          1        -- different level
009          1          2 002
009          2          2 002
009          3          2 003

...但是我标记的行在第一级,所以我不确定这是您的错字还是我听不到您的逻辑。 emp 003的行也缺失。如果不是拼写错误,请显示产生第一个输出(T1)的查询。

编辑:

  

对于级别3,该子项显示为009,以表示子记录(...)I   希望它成为根。

因此,也请在子列中使用connect_by_root。该查询返回示例列child2中列出的值:

SQLFiddle demo

select emp, connect_by_root(trty) trty, level, 
       prior emp as child1,
       connect_by_root(emp) child2
  from t connect by emp = prior mgr
  order by level, emp, trty, prior emp