对组合的 SELECT 的限制

有几项限制适用于您可将 UNION、INTERSECT、MINUS 或 EXCEPT 集合运算符组合在一起的查询。

UNION 子查询是在子查询之内包括 UNION 或 UNION ALL 运算符的查询。下列附加的限制影响 UNION 子查询,但它们不适合于包括 INTERSECT、MINUS 或 EXCEPT 集合运算符的组合的查询:
与 UNION 不一样,在下列上下文中,INTERSECT、MINUS 和 EXCEPT 集合运算符是有效的:
然而,下列限制影响所有组合的查询,包括 UNION 和 UNION ALL 子查询,以及包括 INTERSECT、MINUS 或 EXCEPT 集合运算符的查询:
例如,在上述限制之下,下列查询是有效的:
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);