Oracle SQL - 在链中查找原始ID

时间:2013-12-03 15:29:14

标签: sql oracle

我有一些看起来像这样的数据:

ACT_ID  ACT_ID_FROM
1A  
1B       1A
1C       1B
2A  
2B       2A
2C       2B

但是,我希望能够为数据创建第三列,所以它看起来像这样:

     ACT_ID ACT_ID_FROM ORIG_ID
1A                   1A
1B      1A           1A
1C      1B           1A
2A                   2A
2B      2A           2A
2C      2B           2A

基本上,我对每一行的原始ID感兴趣,因此1C和1B最初都来自ACT_ID 1A(可以从ACT_ID_FROM列确定),但我不知道如何将1A输出,特别是当链中有许多ID时。我正在使用oracle 10g。

此处已经提出类似问题:Find last record in a single-table chain (SQL Server)但我不确定如何将此问题应用于我自己的问题。

提前感谢您的任何建议或帮助。

1 个答案:

答案 0 :(得分:3)

可以通过使用start withconnect by子句以及connect_by_root()运算符选择hierarchical顺序中的行来实现:

SQL> with t1(act_id, act_id_from) as(
  2    select '1A', null from dual union all
  3    select '1B', '1A' from dual union all
  4    select '1C', '1B' from dual union all
  5    select '2A', null from dual union all
  6    select '2B', '2A' from dual union all
  7    select '2C', '2B' from dual
  8  )
  9  select act_id
 10       , act_id_from
 11       , connect_by_root(act_id) as orig_id
 12    from t1
 13   start with act_id_from is null
 14  connect by prior act_id = act_id_from
 15  /

结果:

ACT_ID ACT_ID_FROM ORIG_ID
------ ----------- ---------
1A                 1A
1B     1A          1A
1C     1B          1A
2A                 2A
2B     2A          2A
2C     2B          2A

6 rows selected