Поиск корня в Иерархическом запросе.

savelii
Дата: 05.12.2007 17:13:59
Добрый вечер. Надеюсь на вашу помощь.
Задача стоит следующая, есть запрос:
SQL> with a as ( select 1 id , 0 pid from dual
2 union
3 select 2 id , 1 pid from dual
4 union
5 select 2 id , 0 pid from dual
6 union
7 select 3 id , 2 pid from dual
8 )
9 select a.*
10 from a a
11 connect by prior id = pid
12 start with id = 1
13 /

        ID        PID
---------- ----------
1 0
2 1
3 2

Dct нормально. Но как вытащить для всех строк корень, чтоб результат был такой:

 ROOT   ID        PID
---------- ----------
1 1 0
1 2 1
1 3 2

Замечу в обратную сторону движение не пройдет потому как связи многие ко многим.

Спасибо.
OraDen
Дата: 05.12.2007 17:19:38
savelii
Замечу в обратную сторону движение не пройдет потому как связи многие ко многим.
Вот про это поподробнее. Версия оракла какая?
йохо
Дата: 05.12.2007 17:19:58
Что такое root? Почему у тебя он 1, а не 0?
Jannny
Дата: 05.12.2007 17:22:05
connect_by_root
А если Ваша неозвученная версия не позволяет, то издеваемся над sys_connect_by_path
Дубовая голова
Дата: 05.12.2007 17:22:19
йохо
Что такое root? Почему у тебя он 1, а не 0?


Для данного конкретного случая

start with id = 1


2 Автор: версия какая ?
OraDen
Дата: 05.12.2007 17:28:55
Jannny
А если Ваша неозвученная версия не позволяет, то издеваемся над sys_connect_by_path
тынц
savelii
Дата: 05.12.2007 17:31:15
Переформулирую:
Имеется движение от листа 1 к корню 33. Получаю

SQL> with a as ( select 1 id , 22 pid from dual
2 union
3 select 2 id , 22 pid from dual
4 union
5 select 22 id , 33 pid from dual
6 union
7 select 24 id , 33 pid from dual
8 union
9 select 33 id , null pid from dual
10 )
11 select a.*
12 from a a
13 connect by prior pid = id
14 start with id = 1
15 /

ID PID
---------- ----------
1 22
22 33
33

А цель такова чтобы было так:
LIST     ID        PID
---------- ----------
1 1 22
1 22 33
1 33

Чтоб потом взять этот лист 1 и вытащить весь список связанных с ним значений. Что то вроде этого.
Версия Oracle 9.2.0.6
йохо
Дата: 05.12.2007 17:35:56
savelii
Переформулирую:
Имеется движение от листа 1 к корню 33. Получаю

SQL> with a as ( select 1 id , 22 pid from dual
2 union
3 select 2 id , 22 pid from dual
4 union
5 select 22 id , 33 pid from dual
6 union
7 select 24 id , 33 pid from dual
8 union
9 select 33 id , null pid from dual
10 )
11 select a.*
12 from a a
13 connect by prior pid = id
14 start with id = 1
15 /

ID PID
---------- ----------
1 22
22 33
33

А цель такова чтобы было так:
LIST     ID        PID
---------- ----------
1 1 22
1 22 33
1 33

Чтоб потом взять этот лист 1 и вытащить весь список связанных с ним значений. Что то вроде этого.
Версия Oracle 9.2.0.6


select min(id) from a
?
Jannny
Дата: 05.12.2007 17:39:40
йохо
select min(id) from a
?
Более того, писать туда то, что автор пишет в start with :)
dmidek
Дата: 05.12.2007 17:40:31
йохо

select min(id) from a
?


Зачем мелочиться - минимум искать.
Напишем тогда сразу select 1 , .... from a