加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

FROM子句中的嵌套括号是否有效Oracle SQL语法?

发布时间:2021-03-30 14:11:04 所属栏目:站长百科 来源:网络整理
导读:此查询是否使用正确的Oracle语法? select * from ( ( ( dual a) ) ) where a.dummy = 'X'; 它适用于11g和12c,但它是真正有效的语法吗?或者这只是一个编译器“错误”,将来可能会修复,导致代码失败? 我怀疑这是正确的语法,原因如下: 除了添加额外的括号之

此查询是否使用正确的Oracle语法?

select * from ( ( ( dual a) ) ) where a.dummy = 'X';

它适用于11g和12c,但它是真正有效的语法吗?或者这只是一个编译器“错误”,将来可能会修复,导致代码失败?

我怀疑这是正确的语法,原因如下:

>除了添加额外的括号之外,它似乎没有做任何其他事情.像((1 2)* 3)这样的表达式显然可以从嵌套括号中受益,但我看不出它们如何帮助FROM子句.当我查看上面的查询时,别名“a”看起来超出了范围.
>我在SQL Language Reference syntax diagrams中找不到此语法的有效路径.另一方面,很容易看到如何允许嵌套括号用于expressions,conditions,
表达式,条件和子查询是递归的,可以包含括号,但join子句不是递归的.

我担心这一点,因为有类似的情况,无效语法在一个版本中起作用,然后在下一个版本中失败.例如: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.

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!