从Oracle表中获取级别为的父项
我有一些分层数据是有序和分级的,但是父/子关系没有明确定义从Oracle表中获取级别为的父项,oracle,Oracle,我有一些分层数据是有序和分级的,但是父/子关系没有明确定义 ORD ID LVL 0 ABC 1 1 DEF 1 2 EFG 2 .. .. 3 .. .. 3 .. .. 2 .. .. 2 .. .. 1 我要做的是计算每行的父ID,如下所示: ORD ID LVL PAREN
ORD ID LVL
0 ABC 1
1 DEF 1
2 EFG 2
.. .. 3
.. .. 3
.. .. 2
.. .. 2
.. .. 1
我要做的是计算每行的父ID,如下所示:
ORD ID LVL PARENT
0 ABC 1 ABC
1 DEF 1 DEF
2 EFG 2 DEF
.. HIJ 3 EFG
.. KLM 3 EFG
.. NOP 2 DEF
.. QRS 2 DEF
.. TUV 1 TUV
我一直在摸索案例陈述和最后的价值,但我现在求助于问这里。我想,如果我能计算出父ID,我可以使用oracle的分层函数对数据求和,但现在这对我来说只是一个平面表
我该怎么做
编辑:这里有一个更好的数据示例。ORD是唯一且不断增加的,但它会重置每个模型。我想这就是造成我的问题的原因
ORD ID LVL
0 W7957 01
1 29813 01
2 37830 01
3 42986 01
4 C8746 02
5 V1970 02
6 P7958 03
7 P8500 03
8 V2405 03
9 F3400 03
10 E3366 02
11 M2894 03
12 53928 03
13 22480 03
14 27120 02
15 18159 02
16 T4193 03
17 X7371 03
18 X8257 03
最终决定-这是有效的。我不得不使用rownum,而不是order和MODEL_名称和order,但解决方案奏效了。非常感谢你的帮助 如果ORD是唯一的并且是连续增加的,例如:
select * from table555;
ORD ID LVL PAR
---------- --- ---------- ---
0 ABC 1 ABC
1 DEF 1 DEF
2 EFG 2 DEF
3 HIJ 3 EFG
4 KLM 3 EFG
5 NOP 2 DEF
6 QRS 2 DEF
7 TUV 1 TUV
然后在Oracle12c上,您可以使用以下查询:
select t.* ,
nvl(
( select id from table555 t1
where t1.lvl < t.lvl
and t1.ord < t.ord
order by ord desc
fetch first row only
)
,
id ) As my_par
from table555 t
;
ORD ID LVL PAR MY_
---------- --- ---------- --- ---
0 ABC 1 ABC ABC
1 DEF 1 DEF DEF
2 EFG 2 DEF DEF
3 HIJ 3 EFG EFG
4 KLM 3 EFG EFG
5 NOP 2 DEF DEF
6 QRS 2 DEF DEF
7 TUV 1 TUV TUV
在早期版本中,可以使用两个子查询:
select ORD,ID,LVL,PARENT,
(SELECT id FROM table555 t1
WHERE t1.ord = t.max_ord
) as my_parent
FROM (
select t.*,
nvl(
(select max( ord )
from table555 t1
where t1.lvl < t.lvl
and t1.ord < t.ord
),
ord
)as max_ord
from table555 t
) t
;
ORD ID LVL PAR MY_
---------- --- ---------- --- ---
0 ABC 1 ABC ABC
1 DEF 1 DEF DEF
2 EFG 2 DEF DEF
3 HIJ 3 EFG EFG
4 KLM 3 EFG EFG
5 NOP 2 DEF DEF
6 QRS 2 DEF DEF
7 TUV 1 TUV TUV
ORD是唯一的并且不断增加吗?谢谢-这在前几行有效,但是在大约3级之后开始给出一些奇怪的答案。ORD LVL ID父级1 17957 7957 2 1 9813 9813 3 1 7830 7830 4 1 2986 2986 5 2 8746 2986 6 2 1970 2986 7 3 7958 1970 8 3 8500 5230 9 3 2405 0359 10 3 3400 8153 11 2 3366 2986 12 3 2894 3366 13 3928 6413 14 3 2480 5325 15 2 7120 8518-无法使用我想要的小评论块…请提供,特别是要处理的样本数据,在重要列中没有点。正如我在anwer中所指出的,这个查询只能在ORD是唯一的并且不断增加的假设下工作。如果不查看表和数据,就很难诊断问题。