Доступ к родительскому псевдониму в подзапросе в предложении with с помощью подключения в Oracle

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

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

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 on rownumber = 1 по описанию уровня, однако я получаю ту же самую ошибку при попытке сослаться на m.id.

Благодарю вас!


person Craig    schedule 26.03.2012    source источник
comment
Oracle9i Release 9.2.0.7.0 — 64-битная рабочая версия   -  person Craig    schedule 26.03.2012
comment
Я не очень разбираюсь в этом, но что произойдет, если вы попытаетесь использовать версию без псевдонимов? start with mb.id = meta.id   -  person Ben Lee    schedule 26.03.2012
comment
Неурезанная версия имеет несколько соединений с метаданными, так что это не сработает.   -  person Craig    schedule 26.03.2012
comment
Кажется, в более новых версиях это решается, но я не уверен, как заставить его работать, вытягивая переменную через запросы.   -  person Craig    schedule 26.03.2012


Ответы (1)


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

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; 
person arturro    schedule 26.03.2012
comment
Вау, я подумал, что соединение прекратится, когда имя не будет в одном из этих двух, а не просто проигнорирует эту строку, но продолжит соединение. Благодарю вас! - person Craig; 27.03.2012