oracle 11g 别名查询
Posted
技术标签:
【中文标题】oracle 11g 别名查询【英文标题】:oracle 11g alias to query 【发布时间】:2012-02-15 09:19:26 【问题描述】:从 oracle 10g 迁移到 11g 时,我有一个存储过程,其语法如下:
select * from table1
union
select t,y from
(select * from table2)aliasQuery
where t=aliasQuery.t
该查询在 10g 上运行良好,但 11g 返回一个错误,即未定义 aliasQuery。
也许 11g 不再支持这种语法,或者缺少一些数据库配置?
编辑
完整的查询是:
select *
from table1
union
select t, y
from ( select *
from table2 ) aliasQuery
where ( select max(t)
from ( select t
from table3
where table3.t = aliasQuery.t)
)>10
【问题讨论】:
此语法在 11g 中运行良好。你说它是存储过程的一部分,你能提供所有的代码吗?另外,你能提供返回的确切错误吗? select * from table1 union select t,y from (select * from table2)aliasQuery where (select max(t)from (select t from table 3 where table3.t=aliasQuery.t)跨度> 错误:无效标识符 aliasQuery.t @Hadad,我已将您发布的查询添加到问题中。如您所见,where
中没有条件是没有意义的。你确定这是正确的吗?
当然有条件,但我错过了,我会更新问题
【参考方案1】:
根据 Ask Tom 的文章“Is there some sort of nesting limit for correlated subqueries?”,相关子查询别名工作不止一个级别似乎是一个已修复的错误。看起来您的 10g 数据库没有修复错误,而您的 11g 有。我在我的 10g 数据库上尝试了您的查询,但它失败并出现与我的 11g 数据库相同的错误:ORA-00904: "ALIASQUERY"."T": invalid identifier
。
您将不得不稍微更改查询以使其现在在 11g 中工作。
【讨论】:
【参考方案2】:我可以确认这不起作用。我得到和你一样的错误:
select t, y
from ( select 1 t, 2 y
from dual ) aliasQuery
where ( select max(t)
from ( select t
from (select 1 as t from dual) table3
where table3.t = aliasQuery.t)
)>10
但这确实:
select t, y
from ( select 1 t, 2 y
from dual ) aliasQuery
where ( select max(t)
from (select 1 as t from dual) table3
where table3.t = aliasQuery.t
)>10
翻译成你的查询,你必须这样重写它:
select *
from table1
union
select t, y
from ( select *
from table2 ) aliasQuery
where ( select max(t)
from table3 -- no need to add yet another nested select here
where table3.t = aliasQuery.t)
)>10
我无法告诉你为什么你的语法不再有效。我觉得没问题。显然 table-rename 的范围不再达到双重嵌套选择,我觉得有点可怕!
【讨论】:
以上是关于oracle 11g 别名查询的主要内容,如果未能解决你的问题,请参考以下文章