0

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を最初から取得するか、これをリファクタリングして機能させるにはどうすればよいですか?また、ネストされたselectを使用して、where on rownumber = 1をレベルdescで並べ替えてみましたが、m.idを参照しようとするとまったく同じエラーが発生します。

ありがとうございました!

4

1 に答える 1

2

このクエリを次のように単純化できませんか?

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; 
于 2012-03-26T20:14:54.557 に答える