单个查询中多个SQL集运算符的作用是什么?

时间:2013-02-04 19:53:36

标签: sql teradata

我试图了解具有多个“set”运算符的现有查询发生了什么。我尝试过的各种网络搜索都没有透露任何内容,也没有快速查看Teradata文档。

这是我正在查看的查询的伪代码表示:

SELECT column from table1
UNION
SELECT column from table2
UNION
SELECT column from table3
MINUS 
   (select column from table 4)
UNION
SELECT column from table4

我最感兴趣的是如何处理MINUS;它是仅从table3中的前一个SELECT中减去行还是从组合结果集中减去?请注意,MINUS表达式中的括号位于我正在查看的代码中。

此外,我假设最后UNION根本不受MINUS操作的约束。

我确信我可以通过创建一些示例表来解决这个问题,但我现在无法访问数据库(尝试在今天从家里完成一些工作)。

仅供参考:Teradata MINUS与ANSI EXCEPT相同。

4 个答案:

答案 0 :(得分:6)

在oracle上 http://docs.oracle.com/cd/B28359_01/server.111/b28286/queries004.htm

  

您可以使用set运算符UNION,UNION组合多个查询   ALL,INTERSECT和MINUS。所有集合运算符都具有相同的优先级。如果   SQL语句包含多个集合运算符,然后是Oracle数据库   除非明确括号,否则从左到右评估它们   指定另一个订单。

http://www.postgresql.org/docs/current/static/sql-select.html#SQL-EXCEPT

  

评估同一SELECT语句中的多个EXCEPT运算符   从左到右,除非括号另有规定。除了绑定   与UNION相同的水平。

但是,在postgresql中

http://www.postgresql.org/docs/current/static/sql-select.html#SQL-INTERSECT

  

同一SELECT语句中的多个INTERSECT运算符   从左到右进行评估,除非括号另有规定。    INTERSECT比UNION绑定得更紧。即A UNION B INTERSECT   C将被视为A UNION(B INTERSECT C)。

任何引号中的重点都是我自己做的..

所以,这取决于实施。

答案 1 :(得分:2)

您可以在this sqlfiddle中查看Oracle如何处理它 - 它会将MINUS应用于整个集合,直到该点为止。其他DB的工作方式类似,而且Teradata的优势相同,因为EXCEPT(Oracle和Teradata调用MINUS)是ANSI标准运算符。

答案 2 :(得分:2)

JayC的回答给了我一个如何搜索的线索,我能够找到合适的Teradata参考。我将为未来的读者添加这个。从第6章开始, SQL函数,运算符,表达式和谓词

The precedence for processing set operators is as follows:
1 INTERSECT
2 UNION and MINUS/EXCEPT
The set operators evaluate from left to right if no parentheses explicitly specify another order.

甚至有一个类似于我的情况的例子。 Here is a link下载pdf。

答案 3 :(得分:0)

我相信大多数数据库都是从上到下进行,沿途构建集合。但理想情况下,您应该编写代码以反映您想要的优先级,例如,

(((
SELECT column from table1
UNION
SELECT column from table2
) a
UNION
SELECT column from table3
) b
MINUS 
   (select column from table 4)
) c
UNION
SELECT column from table4 
相关问题