2013-12-03 5 views
0

У меня есть некоторые данные, которые выглядят следующим образом:Oracle SQL - найти оригинальный идентификатор в цепи

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 и 1В как изначально пришел из ACT_ID 1А ​​(который может быть определен из колонки ACT_ID_FROM), но я не знаю, как чтобы получить 1A, особенно когда в цепочке было несколько идентификаторов. Я использую oracle 10g.

Аналогичный вопрос уже задан здесь: Find last record in a single-table chain (SQL Server), но я не уверен, как применить это к моей собственной проблеме.

Заранее благодарим за любые советы или помощь.

+0

третья строка первой таблицы должны быть '1С 1B', правильно? – mavroprovato

+0

Да, он идет 1A -> 1B -> 1C, поэтому 1C поступает из 1B, а 1B - от 1A, 1A - исходный экземпляр, поэтому он появился из ниоткуда. Я исправил это сейчас, спасибо за место. – bawpie

ответ

3

Это может быть достигнуто путем отбора строк в hierarchical порядке с использованием start with и connect by положения и connect_by_root() оператора:

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 
+0

Спасибо за быстрый и ясный ответ. Раньше я использовал connect_by_root, но он даже не передумал использовать его. Спасибо, вы только что сделали очень неприятный процесс намного более терпимым! – bawpie

Смежные вопросы