INTERSECT与UNION相比,优先级更高吗?

8
如果我们考虑三个单列表,每个表都有两行:A = (1, 2),B = (2, 3),C = (3, 4)。然后,如果我们尝试使用括号同时使用UNIONINTERSECT,结果是相当一致的:
  • (select * from a union select * from b) intersect select * from c -> 3
  • select * from a union (select * from b intersect select * from c) -> 1, 2, 3
但是,简单明了的...
  • select * from a union select * from b intersect select * from c
我已经在几个数据库上尝试过(SQL Fiddle),我得到的实证结果是:
  • 在一方面,Oracle、PostgreSQL和H2认为INTERSECT与UNION的优先级相同(因此结果为3)。
  • 然后,在另一方面,DB2、SQL Server、MariaDB、Apache Derby和HyperSQL认为INTERSECT的优先级高于UNION(因此结果为1, 2, 3)。
  • MySQL和Sybase ASE则不参与比较,因为它们根本不实现INTERSECT。

你们知道这方面是否有任何官方定义吗?我浏览了SQL-92规范,但没有找到相关内容。


2
有趣。我本来以为它们应该具有相同的优先级(类似于 +-)。如果标准中有规则,我会认为Postgres最接近。话虽如此,我总是会使用括号。 - Gordon Linoff
Oracle SQL中,所有的集合操作显然具有相等的优先级。我现在手头没有我的ANSI SQL语法(它在另一台电脑上),所以我现在无法对此发表意见。如果你面前有它,你应该能够从中推断出优先级。 - 500 - Internal Server Error
你在哪个Postgres版本上尝试过这个?我在我尝试的每个版本中都得到了1,2,3,因此INTERSECT比UNION具有更高的优先级 - 我认为这符合标准。 - ypercubeᵀᴹ
Postgres文档(SELECT页面):*“同一SELECT语句中的多个INTERSECT运算符从左到右进行评估,除非括号另有规定。 INTERSECTUNION更紧密。也就是说,A UNION B INTERSECT C将被解释为A UNION (B INTERSECT C)。”* - ypercubeᵀᴹ
1个回答

5

Oracle在其文档中有这样的解释说明:

为了遵守新兴的SQL标准,Oracle的未来版本将赋予INTERSECT运算符比其他集合运算符更高的优先级。因此,在使用INTERSECT运算符与其他集合运算符一起的查询中,您应该使用括号来指定计算顺序。

因此,至少在Oracle看来,相等的优先级与标准不一致。

作为一条注释:我经常发现标准如此晦涩难懂,所以像这样的提示比尝试解密实际文本更简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接