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 别名查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 11g 总结篇2

查询在 Oracle 11g 上有效,但在 Oracle 8i 上失败

Oracle11g 带分页的选择查询

奇怪的查询行为 oracle 11g

如何在 Oracle 11g 的“选择”查询中添加偏移量?

Oracle 11g 子查询中缺少表达式