объединить записи

Eva11
Дата: 02.12.2009 17:42:53
Добрый вечер, подскажите как лучше это сделать. есть такая таблица
id name nasl_id pr
1a2
2b3
3c5
5d20
13e14
14f17
17g19
11h12
12j35


Нужно проставить объединяющий признак строкам, там где есть наследование, то есть id в текущей строке равно nasl_id в следующей строке по цепочке. Должно получиться следующее

id name nasl_id pr
1a21
2b31
3c51
5d201
13e142
14f172
17g192
11h123
12j353


Наверное, это лучше сделать с помощью аналитических функций,но пока ничего не могу придумать...
suPPLer
Дата: 02.12.2009 18:04:59
Eva11,

with t as (select level id, nullif(level - 1, 0) parent_id from dual connect by level <= 3
            union all
           select level + 10 id, nullif(level - 1, 0) + 10 parent_id from dual connect by level <= 3)
select id, parent_id, connect_by_root(id)
  from t
 start with parent_id is null
connect by prior id = parent_id
eva11
Дата: 02.12.2009 18:18:47
suPPLer,
ORA-00904: "CONNECT_BY_ROOT": недопустимый идентификатор
_Alex_SMIRNOV_
Дата: 02.12.2009 18:33:01
WITH a AS (
SELECT 1 id1, 'b' NAME, 2 nasl_id FROM dual UNION ALL 
SELECT 2 id1, 'b' NAME, 3 nasl_id FROM dual UNION ALL 
SELECT 3 id1, 'c' NAME, 5 nasl_id FROM dual UNION ALL 
SELECT 5 id1, 'd' NAME, 20 nasl_id FROM dual UNION ALL 
SELECT 13 id1, 'e' NAME, 14 nasl_id FROM dual UNION ALL 
SELECT 14 id1, 'f' NAME, 17 nasl_id FROM dual UNION ALL 
SELECT 17 id1, 'g' NAME, 19 nasl_id FROM dual UNION ALL 
SELECT 11 id1, 'h' NAME, 12 nasl_id FROM dual UNION ALL 
SELECT 12 id1, 'j' NAME, 35 nasl_id FROM dual)
SELECT id1, NAME, nasl_id, SUM(grp) OVER(ORDER BY name) pr
  FROM (SELECT a.*, DECODE(id1, LAG(nasl_id) OVER (ORDER BY name), 0, 1) grp FROM a)
Добрый Э - Эх
Дата: 03.12.2009 06:01:42
Как вариант на деревьях для девятки:
--
-- Тестовые данные:
WITH a AS (
SELECT 1 id1, 'b' NAME, 2 nasl_id FROM dual UNION ALL 
SELECT 2 id1, 'b' NAME, 3 nasl_id FROM dual UNION ALL 
SELECT 3 id1, 'c' NAME, 5 nasl_id FROM dual UNION ALL 
SELECT 5 id1, 'd' NAME, 20 nasl_id FROM dual UNION ALL 
SELECT 13 id1, 'e' NAME, 14 nasl_id FROM dual UNION ALL 
SELECT 14 id1, 'f' NAME, 17 nasl_id FROM dual UNION ALL 
SELECT 17 id1, 'g' NAME, 19 nasl_id FROM dual UNION ALL 
SELECT 11 id1, 'h' NAME, 12 nasl_id FROM dual UNION ALL 
SELECT 12 id1, 'j' NAME, 35 nasl_id FROM dual)
--
-- Основной запрос:
 select id1, name, nasl_id, 
        --
        -- Замена CONNECT_BY_ROOT для версии Oracle 9i
        replace(sys_connect_by_path(decode(level,1,id1),','),',') as root_id
   from a a1
  start with not exists(select null from a a0 where a0.nasl_id = a1.id1)
connect by id1 = prior nasl_id

Query finished, retrieving results...

ID1   NAME   NASL_ID   ROOT_ID
---   ----   -------   -------
  1   b            2         1
  2   b            3         1
  3   c            5         1
  5   d           20         1
 11   h           12        11
 12   j           35        11
 13   e           14        13
 14   f           17        13
 17   g           19        13

9 row(s) retrieved