从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
答案 0 :(得分:3)
基于Ask Tom文章“Is there some sort of nesting limit for correlated subqueries?”,似乎相关的子查询别名工作多个级别是一个修复过的错误。看起来你的10g数据库没有你的11g的错误修复。我在我的10g数据库上尝试了你的查询,它失败的错误与我的11g数据库相同:ORA-00904: "ALIASQUERY"."T": invalid identifier
。
你将不得不稍微改变一下这个问题,让它现在以11g的速度运行。
答案 1 :(得分: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
我无法告诉你为什么你的语法不再适用。它对我来说很好看。显然,表重命名的范围不再达到双重嵌套选择,我觉得有点吓人!