Найти всех дедушек в одном запросе...

orabin
Дата: 06.06.2006 11:02:14
Дано:

Обычная "древовидная" таблица вида:
menitem_id
name
parent_menitem_id

Есть корневой узел у которого parent_menitem_id is null

Есть список menitem_id которые необходимо отображать...(причем они могут быть на разных левелах) - назовем его список A

Задача: Как одним запросом получить список всех дедушек для этого списка A?

Или может подскажете эффектное решение на plsql?
он же
Дата: 06.06.2006 11:03:56
START WITH... CONNECT BY PRIOR... LEVEL...
orabin
Дата: 06.06.2006 11:07:28
не получается....так только одну ветку верх к папкам можно получить...

можно посмотреть весь ваш запрос?
он же
Дата: 06.06.2006 11:14:42
Если я правильно понял

Connected to Oracle9i Enterprise Edition Release 9.2.0.6.0 
Connected as one_fifteen

SQL> create table x$menu (id_ number(10) ,name_ varchar2(255), parent_ number(10));
SQL> insert into x$menu values (1,'Тест',null);
SQL> insert into x$menu values (2,'Тест-2',null);
SQL> insert into x$menu values (3,'Тест, потомок 1',1);
SQL> insert into x$menu values (4,'Тест, потомок 3',3);
SQL> insert into x$menu values (5,'Тест, потомок 4',4);
SQL> insert into x$menu values (6,'Тест, потомок 2',2);
SQL> select *
  2  from x$menu
  3  where level = 3
  4  start with id_ = 5
  5  connect by prior parent_=id_
  6  /

        ID_ NAME_                                                                                PARENT_
----------- -------------------------------------------------------------------------------- -----------
          3 Тест, потомок 1                                                                            

SQL> select *
  2  from x$menu
  3  where level = 3
  4  start with id_ = 4
  5  connect by prior parent_=id_
  6  /

        ID_ NAME_                                                                                PARENT_
----------- -------------------------------------------------------------------------------- -----------
          1 Тест                                                                             

SQL> 
Владимор Конев
Дата: 06.06.2006 11:17:30
orabin
не получается....так только одну ветку верх к папкам можно получить...

можно посмотреть весь ваш запрос?


Ты лучше вначале свой "неполучающийся" запрос покажи, + структуры таблицы и тестовый набор данных, а также то, что тебе в итоге получить надо.
orabin
Дата: 06.06.2006 11:23:53
не совсем

вот покажите мне в одном запрос всех дедушек для id_ in (5,6)

причем я заранее не знаю на каких они уровнях иерархии находятся...
он же
Дата: 06.06.2006 11:28:27
Перебирайте пока по одному - кто вам мешает? :)

А LEVEL - это относительный уровень.
Например,

select *
from x$menu
where level = 3
start with id_ = 4
connect by prior parent_=id_

Здесь LEVEL = 1 будет для id_ = 4
LEVEL 2 - для его родителя
LEVEL 3 - для дедушки
независимо от текущего уровня в иерархии

Я специально два запроса привел, чтобы стало понятно :D
Не стало....
orabin
Дата: 06.06.2006 11:30:15
2Конев

Мне надо для
create table x$menu (id_ number(10) ,name_ varchar2(255), parent_ number(10));
insert into x$menu values (1,'Тест',null);
insert into x$menu values (2,'Тест-2',null);
insert into x$menu values (3,'Тест, потомок 1',1);
insert into x$menu values (4,'Тест, потомок 3',3);
insert into x$menu values (5,'Тест, потомок 4',4);
insert into x$menu values (6,'Тест, потомок 2',2);

Мне надо для id_ in (5,6)
чтобы вернуло
1
3
4
2

(не обязательно в таком порядке :))
orabin
Дата: 06.06.2006 11:32:34
2онже

не стало :(

вы мне окончательный запрос покажите плиз
andrey_anonymous
Дата: 06.06.2006 11:35:40
orabin
вы мне окончательный запрос покажите плиз

Вы задачку-то поставьте по-человечески...
А то Вас не разберешь - толи дедушек, чтоли бабушек, толи стариков-разбойников...
SQL> with x$menu as(
select 1 id_,'Тест' name_, to_number(null) parent_ from dual union all
select 2,'Тест-2',null from dual union all
select 3,'Тест, потомок 1',1 from dual union all
select 4,'Тест, потомок 3',3 from dual union all
select 5,'Тест, потомок 4',4 from dual union all
select 6,'Тест, потомок 2',2 from dual
) select *
from x$menu
where level >1
start with id_ in( 5,6)
connect by prior parent_=id_;

       ID_ NAME_              PARENT_
---------- --------------- ----------
         4 Тест, потомок 3          3
         3 Тест, потомок 1          1
         1 Тест            
         2 Тест-2          

SQL>