gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:42:50 25 4
gpt4 key购买 nike

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

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

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

出于以下原因,我怀疑这是正确的语法:

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

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

原始查询的样式很糟糕,但不值得更改我们的生产查询,除非确实存在问题。

查询无效吗?或者该语法是否有一些合理的理由,或者我在语法图中是否缺少某些路径?

最佳答案

FROMjoin 子句中使用括号是合法的语法,并且括号确实有效果。

考虑这个查询:

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;

括号允许您对表 bc 进行内部联接,然后将其外部联接到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com