在 Oracle 中使用 connect by 在 with 子句中访问子查询中的父别名
Posted
技术标签:
【中文标题】在 Oracle 中使用 connect by 在 with 子句中访问子查询中的父别名【英文标题】:Access parent alias in subquery within a with clause using connect by in Oracle 【发布时间】:2012-03-26 19:29:12 【问题描述】:我正在尝试使用 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 开始使用,或者重构它以使其工作?我还尝试使用一些嵌套选择并按级别 desc 执行 where on rownumber = 1 order,但是在尝试引用 m.id 时出现完全相同的错误。
谢谢!
【问题讨论】:
Oracle9i 版本 9.2.0.7.0 - 64 位生产 我不是这方面的专家,但是如果您尝试使用非别名版本会发生什么?start with mb.id = meta.id
非精简版有多个元连接,所以这不起作用。
似乎较新的版本解决了这个问题,但我不确定如何通过查询拉变量来使其工作。
【参考方案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;
【讨论】:
哇,我认为当 name 不在这两个之一中时 connect by 会停止,而不是忽略该行但继续加入。谢谢!以上是关于在 Oracle 中使用 connect by 在 with 子句中访问子查询中的父别名的主要内容,如果未能解决你的问题,请参考以下文章
oracle connect by 和 start with 的用法
ORACLE 的CONNECT BYSTART WITH,CONNECT_BY_ROOTCONNECT_BY_ISLEAFSYS_CONNECT_BY_PATH,LEVEL的使用(Hierarc(代码