我有一些看起来像这样的数据:
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)但我不确定如何将此问题应用于我自己的问题。
提前感谢您的任何建议或帮助。
答案 0 :(得分:3)
可以通过使用start with
和connect 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