有几项限制适用于您可将 UNION、INTERSECT、MINUS 或 EXCEPT 集合运算符组合在一起的查询。
- 在每一查询的 Projection 子句中的项的数目必须相同,且在每一 Projection 子句中的相应的项必须有可兼容的数据类型。
- 每一查询的 Projection 子句不可指定 BYTE 或 TEXT 对象(此限制不适用于 UNION ALL 操作。)
- 如果组合的查询包括 SELECT 语句的 ORDER BY 子句,则它必须跟在最后的 Projection 子句之后,且您必须通过整数 select_number 来指定每一排序的项,而不是通过它的 SQL 标识符。排序发生在集合操作完成之后。
- 您可在临时表中存储任何集合运算符的组合的结果,但 INTO TEMP 子句仅可出现在最终的 SELECT 语句中。
- 在 GBase 8s ESQL/C 中,您不可在复合的查询中使用 INTO 子句,除非恰好返回一行,且您没有在使用游标。
在此情况下,INTO 子句必须在该集合运算符组合的第一个 SELECT 语句中。
UNION 子查询是在子查询之内包括 UNION 或 UNION ALL 运算符的查询。下列附加的限制影响 UNION 子查询
,但它们不适合于包括 INTERSECT、MINUS 或 EXCEPT 集合运算符的组合的查询:
- CREATE VIEW 语句不可指定 UNION 子查询来定义视图。
- 在 UNION 子查询中,仅本地数据库中的列是有效的。您不可在 UNION 子查询中引用远程表或视图。
与 UNION 不一样,在下列上下文中,INTERSECT、MINUS 和 EXCEPT 集合运算符是有效的:
- 在组合的查询中,该查询引用本地的
GBase 8s
服务器实例的其他数据库中的表的列,以及在其他的
GBase 8s
服务器实例的表中的列。
- 在视图定义中(然而,您不可在还包括集合运算符的 CREATE VIEW 语句中指定 WITH CHECK OPTION)。
然而,下列限制影响所有组合的查询,包括 UNION 和 UNION ALL 子查询,以及包括 INTERSECT、MINUS 或 EXCEPT 集合运算符的查询:
- UNION 子查询组合的查询 不可为触发器事件。如果有效的组合的查询指定列,在其上已定义了 Select 触发器,则该查询成功,但忽略该触发器(或视图上的 INSTEAD OF 触发器)。
- 在一个包括 UNION 子查询或任何其他集合运算符的查询中,在 ALL、ANY、IN、NOT IN 和 SOME 运算符的左边,包括主变量的通用的表达式是无效的。然而,在此上下文中只由单个主变量构成的表达式是有效的。
例如,在上述限制之下,下列查询是有效的:
SELECT col1 FROM tab1 WHERE ? <= ALL
(SELECT col2 FROM tab2 UNION SELECT col3 FROM tab3);
在此示例中,在 ALL 左边的表达式是单个的主变量( ? ),其未包含主变量的唯一的表达式,在一个还包括集合运算符的查询中,在 ALL、ANY、IN、NOT IN 或 SOME 运算符之前支持该主变量。
相反,下列示例展示无效的查询:
SELECT col1 FROM tab1 WHERE (? + 8) <= ALL
(SELECT col2 FROM tab2 UNION SELECT col3 FROM tab3);
该查询失败是因为在 ALL 运算符左边的 <= 关系运算符的一运算对象是 (? + 8)。
在 UNION 子查询 中,包括主变量的算术表达式是无效的语法,在通过任何其他集合运算符组合的查询中也无效。
不包含主变量的表达式不遵守此限制。因此,下列(包括相同的 UNION 子查询的)查询是有效的:
SELECT col1 FROM tab1 WHERE (col1 + 8) <= ALL
(SELECT col2 FROM tab2 UNION SELECT col3 FROM tab3);