Доступ к родительскому псевдониму в подзапросе в предложении with с помощью connect by в Oracle - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь рекурсивно получить некоторые данные, используя connect by, который для каждой строки мне нужно знать, если в другом дереве есть определенный элемент.

Итак, у меня есть этот [урезанный] запрос:

select m.id, m.name,
   (select (
    with recursiveMetaClass as (
            select mb.name
            from meta mb
            start with mb.id = m.id
            connect by prior mb.metaclass = mb.id and mb.metaclass <> mb.id
    ) select name from recursiveMetaClass where name in ('config_group', 'config_item')
   ) from dual) as basetype
from meta m
inner join meta_rel mr on mr.rel2 = m.id
start with m.name = 'store_sys'
connect by prior m.id = mr.rel1
order siblings by item_order;

Эта ошибка, хотя с ORA-00904 "M". "ID": неверный идентификатор на m.id в начале моего вложенного запроса. Если я заменю запросом на:

select m.id, m.name,
   (select (
    with recursiveMetaClass as (
            select mb.name
            from meta mb
            start with mb.id = 1004
            connect by prior mb.metaclass = mb.id and mb.metaclass <> mb.id
    ) select name from recursiveMetaClass where name in ('config_group', 'config_item')
   ) from dual) as basetype
from meta m
inner join meta_rel mr on mr.rel2 = m.id
start with m.name = 'store_sys'
connect by prior m.id = mr.rel1
order siblings by item_order;

Работает (просто дает неверные результаты).

Как я могу либо запустить m.id в начало, либо изменить его, чтобы он работал? Я также попытался использовать несколько вложенных селекторов и выполнить порядок where на rownumber = 1 по уровню desc, однако я получаю точно такую ​​же ошибку при попытке сослаться на m.id.

Спасибо!

1 Ответ

2 голосов
/ 27 марта 2012

Не можете ли вы упростить этот запрос до следующего?

select m.id, m.name, 
(      select mb.name  
       from meta mb 
       where name in ('config_group', 'config_item') 
       start with mb.id = m.id 
       connect by prior mb.metaclass = mb.id and mb.metaclass <> mb.id 
) as basetype
from meta m  
inner join meta_rel mr on mr.rel2 = m.id 
start with m.name = 'store_sys' 
connect by prior m.id = mr.rel1 
order siblings by item_order; 
...