oracle 11g别名来查询

时间:2012-02-15 09:19:27

标签: sql oracle oracle10g oracle11g

从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

2 个答案:

答案 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

我无法告诉你为什么你的语法不再适用。它对我来说很好看。显然,表重命名的范围不再达到双重嵌套选择,我觉得有点吓人!