【发布时间】:2013-04-02 22:09:54
【问题描述】:
我看了一眼 SQL-92 标准,然后看了一眼有人整理的 SQL-92 语法,但看不懂。
正如SQL Server documentation 提醒我们的那样,在某些情况下应该明确地对表达式进行分组:
默认情况下,SQL Server 2005 评估包含 UNION 运算符的语句 左到右。使用括号指定评估顺序。为了 例如,以下语句不等价:
/* First statement. */
SELECT * FROM TableA
UNION ALL
( SELECT * FROM TableB
UNION
SELECT * FROM TableC
)
GO
/* Second statement. */
(SELECT * FROM TableA
UNION ALL
SELECT * FROM TableB
)
UNION
SELECT * FROM TableC)
GO
在第一个语句中,重复项在联合中被消除 表 B 和表 C。在该集合和 TableA 之间的联合中, 没有消除重复。在第二个语句中,重复项是 包含在 TableA 和 TableB 之间的联合中,但在 随后与 TableC 的联合。 ALL对决赛没有影响 这个表达式的结果。
但我发现 MySQL 和 SqlLite 不支持(供参考,Oracle、SQL Server、Postgres 和 DB2 支持。)
那么我如何检查规范是否允许呢?
【问题讨论】:
-
究竟什么是 MySQL 和 SqlLite 不支持的?
-
公式如
SELECT * FROM p UNION (SELECT * FROM p UNION SELECT * FROM p)。
标签: sql union language-lawyer operator-precedence parentheses