从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是唯一的并且不断增加的假设下工作。如果不查看表和数据,就很难诊断问题。