3

我试图了解具有多个“集合”运算符的现有查询发生了什么。我尝试过的各种网络搜索都没有发现任何东西,我对 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操作的影响。

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

仅供参考:TeradataMINUS与 ANSI 相同EXCEPT

4

4 回答 4

6

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

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

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

除非括号另有说明,否则同一 SELECT 语句中的多个 EXCEPT 运算符从左到右求值。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)。

强调,在任何引用中,都是我自己做的。

因此,这取决于实施。

于 2013-02-04T20:20:20.127 回答
2

您可以在这个 sqlfiddle中看到 Oracle 如何处理它- 它适用MINUS于直到那时聚合的整个集合。其他 DB 的工作方式类似,而且 Teradata 的工作很可能是相同的,因为EXCEPT(Oracle 和 Teradata 调用MINUS)是 ANSI 标准运算符。

于 2013-02-04T20:08:12.170 回答
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.

甚至还有一个与我的情况类似的例子。 这是下载pdf的链接。

于 2013-02-04T21:37:00.403 回答
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 
于 2013-02-04T20:01:09.397 回答