这是我的数据:
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)
我该如何实现?
答案 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
中列出的值:
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