与 UNION 相比,INTERSECT 是否具有更高的优先级?
Does INTERSECT have a higher precedence compared to UNION?
如果我们考虑三个单列表,每个表都有两行:A = (1, 2),B = (2, 3),C = (3, 4)。然后,如果我们使用括号将 UNION
和 INTERSECT
一起尝试,结果非常一致:
(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 规范,但找不到有关该主题的任何内容。
Oracle 在其 documentation 中有此说明:
To comply with emerging SQL standards, a future release of Oracle will give the INTERSECT
operator greater precedence than the other set operators. Therefore, you should use parentheses to specify order of evaluation in queries that use the INTERSECT
operator with other set operators.
所以,Oracle至少认为同等优先级是不符合标准的。
注意:我经常发现标准如此难以理解,以至于像这样的提示比试图破译实际文本更简单。
如果我们考虑三个单列表,每个表都有两行: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 在其 documentation 中有此说明:
To comply with emerging SQL standards, a future release of Oracle will give the
INTERSECT
operator greater precedence than the other set operators. Therefore, you should use parentheses to specify order of evaluation in queries that use theINTERSECT
operator with other set operators.
所以,Oracle至少认为同等优先级是不符合标准的。
注意:我经常发现标准如此难以理解,以至于像这样的提示比试图破译实际文本更简单。