sql - 与 UNION 相比,INTERSECT 是否具有更高的优先级?
问题描述
如果我们考虑三个单列表,每个有两行:A = (1, 2), B = (2, 3), C = (3, 4)。然后,如果我们尝试UNION
并INTERSECT
一起使用括号,结果是非常一致的:
(select * from a union select * from b) intersect select * from c
-> 3select * 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 规范,但找不到关于该主题的任何内容。
解决方案
Oracle 在其文档中有此解释性说明:
为了符合新兴的 SQL 标准,Oracle 的未来版本将赋予
INTERSECT
运算符比其他集合运算符更高的优先级。INTERSECT
因此,在将运算符与其他集合运算符一起使用的查询中,您应该使用括号来指定求值顺序。
所以,Oracle 至少认为相等优先级是不符合标准的。
作为说明:我经常发现标准如此难以理解,以至于这样的提示比试图破译实际文本更简单。
推荐阅读
- python - SQLAlchemy 查询将相关数据的伪列添加为字典数组
- html - 如何使输入类型日期响应
- java - 在 Java 中强制转换由通用实例类型的 getClass() 返回的类是否总是安全的?
- linux - 我如何修复 ksoftirqd 100% cpu
- vowpalwabbit - Vowpal Wabbit:指定学习率计划
- web-scraping - BeautifulSoup 4,查找没有标识符的文本
- python - 如何在 python 的 .txt 文件中搜索值?
- reactjs - 为什么我的 JSX HTML 标签在我的编辑器中被分成多行?
- ramda.js - 在 null/undefined 的情况下是否可以链接 Maybe?
- c++ - 如何继续将卤化物管道的输出传递回管道,直到满足某些条件?