集合查询
描述
将两个子查询合并为一个。 算场支持 3 种集运算符:EXCEPT, INTERSECT, UNION。
语法
subquery1 { { UNION [ ALL | DISTINCT ] |
INTERSECT [ ALL | DISTINCT ] |
EXCEPT [ ALL | DISTINCT ] } subquery2 } [...] }
参数
subquery1、subquery2
任意两个 subquery 子句,如 SELECT 中所述。 这两个子查询必须具有相同的列数,并共享每个相应列的最少见类型。
UNION [ALL | DISTINCT]
返回 subquery1 plus the rows of subquery2` 的结果。
如果指定了 ALL,则保留重复行。
如果指定了 DISTINCT,则结果不包含任何重复行。 这是默认值。
INTERSECT [ALL | DISTINCT]
返回两个子查询中共有的行集。
如果指定了 ALL,则将多次返回 subquery1 和 subquery 中多次出现的行。
如果指定了 DISTINCT,则结果不包含重复行。 这是默认值。
EXCEPT [ALL | DISTINCT ]
返回出现在 subquery1 中但不在 subquery2 中的行。
如果指定了 ALL,则 subquery2 中的每一行都将删除 subquery1 中可能的多个匹配项中的一个。
如果指定了 DISTINCT,则在应用操作之前删除 subquery1 中重复的行,确保删除所有匹配项并且结果将没有重复的行(匹配或不匹配)。 这是默认值。
可指定 MINUS 作为 EXCEPT 的替代语法。
链接集操作时,INTERSECT 的优先级高于 UNION 和 EXCEPT。
每个结果列的类型是 subquery1 和 subquery2 中各自列的最少见类型。
示例
CREATE TABLE number1(c int);
INSERT INTO number1 VALUES (3), (1), (2), (2), (3), (4);
CREATE TABLE number2(c int);
INSERT INTO number2 VALUES (5), (1), (1), (2);
SELECT c FROM number1 EXCEPT SELECT c FROM number2;
+-------+
| c|
+-------+
| 3|
+-------+
| 4|
+-------+
SELECT c FROM number1 MINUS SELECT c FROM number2;
+-------+
| c|
+-------+
| 3|
+-------+
| 4|
+-------+
SELECT c FROM number1 EXCEPT ALL (SELECT c FROM number2);
+-------+
| c|
+-------+
| 3|
+-------+
| 3|
+-------+
| 4|
+-------+
| 2|
+-------+
SELECT c FROM number1 MINUS ALL (SELECT c FROM number2);
+-------+
| c|
+-------+
| 2|
+-------+
| 3|
+-------+
| 3|
+-------+
| 4|
+-------+
(SELECT c FROM number1) INTERSECT (SELECT c FROM number2);
+-------+
| c|
+-------+
| 1|
+-------+
| 2|
+-------+
(SELECT c FROM number1) INTERSECT DISTINCT (SELECT c FROM number2);
+-------+
| c|
+-------+
| 1|
+-------+
| 2|
+-------+
(SELECT c FROM number1) INTERSECT ALL (SELECT c FROM number2);
+-------+
| c|
+-------+
| 1|
+-------+
| 2|
+-------+
(SELECT c FROM number1) UNION (SELECT c FROM number2);
+-------+
| c|
+-------+
| 1|
+-------+
| 5|
+-------+
| 2|
+-------+
| 3|
+-------+
| 4|
+-------+
(SELECT c FROM number1) UNION DISTINCT (SELECT c FROM number2);
+-------+
| c|
+-------+
| 1|
+-------+
| 5|
+-------+
| 2|
+-------+
| 3|
+-------+
| 4|
+-------+
SELECT c FROM number1 UNION ALL (SELECT c FROM number2);
+-------+
| c|
+-------+
| 3|
+-------+
| 1|
+-------+
| 2|
+-------+
| 2|
+-------+
| 3|
+-------+
| 4|
+-------+
| 5|
+-------+
| 1|
+-------+
| 1|
+-------+
| 2|
+-------+