如果我们考虑三个单列表,每个表都有两行: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
?
- 在一方面,Oracle、PostgreSQL和H2认为INTERSECT与UNION的优先级相同(因此结果为3)。
- 然后,在另一方面,DB2、SQL Server、MariaDB、Apache Derby和HyperSQL认为INTERSECT的优先级高于UNION(因此结果为1, 2, 3)。
- MySQL和Sybase ASE则不参与比较,因为它们根本不实现INTERSECT。
你们知道这方面是否有任何官方定义吗?我浏览了SQL-92规范,但没有找到相关内容。
+
和-
)。如果标准中有规则,我会认为Postgres最接近。话虽如此,我总是会使用括号。 - Gordon LinoffINTERSECT
比UNION
更紧密。也就是说,A UNION B INTERSECT C
将被解释为A UNION (B INTERSECT C)
。”* - ypercubeᵀᴹ