FROM子句中的嵌套括号是否有效Oracle SQL语法?
此查询是否使用正确的Oracle语法? select * from ( ( ( dual a) ) ) where a.dummy = 'X'; 它适用于11g和12c,但它是真正有效的语法吗?或者这只是一个编译器“错误”,将来可能会修复,导致代码失败? 我怀疑这是正确的语法,原因如下: >除了添加额外的括号之外,它似乎没有做任何其他事情.像((1 2)* 3)这样的表达式显然可以从嵌套括号中受益,但我看不出它们如何帮助FROM子句.当我查看上面的查询时,别名“a”看起来超出了范围. 我担心这一点,因为有类似的情况,无效语法在一个版本中起作用,然后在下一个版本中失败.例如: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而停止在更高版本中工作. 原始查询的样式很糟糕,但除非存在真正的问题,否则不值得更改我们的生产查询. 查询无效吗?或者是否存在某种合法的语法原因,或者在语法图中是否存在一些我遗漏的路径? 解决方法在FROM中的join子句中使用括号是合法的语法,并且括号确实有效.考虑这个查询: WITH table_a AS ( SELECT rownum id FROM DUAL CONNECT BY LEVEL <= 30),table_b as ( SELECT rownum id FROM DUAL CONNECT BY LEVEL <= 20),table_c AS ( SELECT rownum id FROM DUAL CONNECT BY LEVEL <= 10) SELECT a.id,b.id,c.id FROM table_a a left join ( table_b b inner join table_c c ON c.id = b.id ) ON b.id = a.id ORDER BY 1,2,3; 括号允许您执行表b和c的内连接,然后外连接到a. 没有括号,试图将其表示为左连接是不可能的.你要么不从表a得到11-30行,要么表c的11-20行是空的(取决于你怎么做). 请注意,上述查询等效于: WITH table_a AS ( SELECT rownum id FROM DUAL CONNECT BY LEVEL <= 30),c.id FROM table_b b inner join table_c c on c.id = b.id right join table_a a on a.id = b.id ORDER BY 1,3; ,不需要括号.因此,如果您真的想避免在FROM子句中使用括号,通常可以这样做.就个人而言,我更喜欢LEFT JOIN方法与括号而不是RIGHT JOIN. (编辑:广州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |