【发布时间】:2016-04-17 17:37:23
【问题描述】:
此查询是否使用正确的 Oracle 语法?
select * from ( ( ( dual a) ) ) where a.dummy = 'X';
它适用于 11g 和 12c,但它是真正有效的语法吗?还是这只是一个编译器“错误”,将来可能会修复,导致代码失败?
我怀疑这是正确的语法,原因如下:
- 除了添加额外的括号外,它似乎没有做任何事情。像 ((1+2)*3) 这样的表达式显然可以从嵌套括号中受益,但我看不出它们对 FROM 子句有何帮助。当我查看上面的查询时,别名“a”看起来超出了范围。
- 我在SQL Language Reference syntax diagrams 中找不到此语法的有效路径。另一方面,很容易看出expressions、conditions、conditions 是如何允许嵌套括号的。 和subqueries。表达式、条件和子查询是递归的并且可以包含括号,但连接子句不是递归的。
我担心这一点,因为在类似的情况下,无效语法在一个版本中有效,然后在下一个版本中失败。例如:select (select count(*) from (select * from scott.emp where ename = dual.dummy)) from dual;。该查询在 10.2.0.1.0 中有效,但在更高版本中停止工作,因为 table references are scoped to only one level deep。
原始查询的样式很糟糕,但除非确实存在问题,否则不值得更改我们的生产查询。
查询无效吗?或者该语法是否有一些正当理由,或者我缺少语法图中的某些路径?
【问题讨论】:
标签: oracle oracle11g oracle12c