在 Oracle 中使用 connect by 访问子查询中的父别名

问题描述 投票:0回答:1

我正在尝试使用 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": invalididentifier on m.id in start with 在我的嵌套查询中出现此错误。如果我用查询替换为:

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 order by level desc,但是在尝试引用 m.id 时,我得到了完全相同的错误。

谢谢!

sql oracle nested connect-by ora-00904
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; 
© www.soinside.com 2019 - 2024. All rights reserved.