我试图了解具有多个“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
相同。
答案 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