- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此查询使用正确的 Oracle 语法吗?
select * from ( ( ( dual a) ) ) where a.dummy = 'X';
它适用于 11g 和 12c,但它是真正有效的语法吗?或者这只是一个编译器“错误”,将来可能会修复,导致代码失败?
出于以下原因,我怀疑这是正确的语法:
我担心这一点,因为有类似的情况,无效语法在一个版本中有效,但在下一个版本中失败。例如: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 .
原始查询的样式很糟糕,但不值得更改我们的生产查询,除非确实存在问题。
查询无效吗?或者该语法是否有一些合理的理由,或者我在语法图中是否缺少某些路径?
最佳答案
在 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 行将为 null
(具体取决于你是如何尝试的)。
请注意,上面的查询相当于:
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_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,2,3;
,不需要括号。因此,如果您确实想避免在 FROM
子句中使用括号,通常可以这样做。就我个人而言,我更喜欢带有括号的 LEFT JOIN 方法,而不是 RIGHT JOIN 方法。
关于oracle - FROM 子句中的嵌套括号是否有效的 Oracle SQL 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34754948/
我是一名优秀的程序员,十分优秀!