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

时间:2019-05-20 15:39:08

标签: sql union intersect

如果我们考虑三个具有两行的单列表: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规范,但在主题上找不到任何内容。

1 个答案:

答案 0 :(得分:3)

Oracle在其documentation中有以下解释性说明:

  

为符合新兴的SQL标准,Oracle的未来版本将使INTERSECT运算符的优先级高于其他集合运算符。因此,在将INTERSECT运算符与其他集合运算符结合使用的查询中,应使用括号指定评估顺序。

因此,Oracle至少认为优先级与标准不一致。

请注意:我经常发现标准难以理解,这样的提示比尝试解密实际文本更简单。