⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
集合操作

集合操作允许根据集合操作语义组合查询。集合操作指的是 UNION [ALL]INTERSECT [ALL]EXCEPT [ALL] 子句。原始变体使用集合语义,即它们消除重复项,而带有 ALL 的变体使用多重集语义。

传统的集合操作通过**列位置**统一查询,并要求要组合的查询具有相同数量的输入列。如果列类型不同,可能会添加类型转换。结果将使用第一个查询中的列名。

DuckDB 还支持 UNION [ALL] BY NAME,它通过名称而不是位置连接列。UNION BY NAME 不要求输入具有相同数量的列。对于缺失的列,将添加 NULL 值。

UNION

UNION 子句可用于合并来自多个查询的行。查询需要返回相同数量的列。在必要时,将执行到其中一个返回类型的隐式类型转换,以合并不同类型的列。如果无法转换,UNION 子句将抛出错误。

原始 UNION (集合语义)

原始 UNION 子句遵循集合语义,因此它执行重复项消除,即结果中只包含唯一行。

SELECT * FROM range(2) t1(x)
UNION
SELECT * FROM range(3) t2(x);
x
2
1
0

UNION ALL (多重集语义)

UNION ALL 返回两个查询的所有行,遵循多重集语义,即**不**进行重复项消除。

SELECT * FROM range(2) t1(x)
UNION ALL
SELECT * FROM range(3) t2(x);
x
0
1
0
1
2

UNION [ALL] BY NAME

UNION [ALL] BY NAME 子句可用于通过名称而不是位置合并来自不同表的行。UNION BY NAME 不要求两个查询具有相同数量的列。任何只存在于其中一个查询中的列,在另一个查询中将用 NULL 值填充。

以以下表格为例

CREATE TABLE capitals (city VARCHAR, country VARCHAR);
INSERT INTO capitals VALUES
    ('Amsterdam', 'NL'),
    ('Berlin', 'Germany');
CREATE TABLE weather (city VARCHAR, degrees INTEGER, date DATE);
INSERT INTO weather VALUES
    ('Amsterdam', 10, '2022-10-14'),
    ('Seattle', 8, '2022-10-12');
SELECT * FROM capitals
UNION BY NAME
SELECT * FROM weather;
城市 国家 degrees 日期
西雅图 NULL 8 2022-10-12
阿姆斯特丹 NL NULL NULL
柏林 德国 NULL NULL
阿姆斯特丹 NULL 10 2022-10-14

UNION BY NAME 遵循集合语义(因此它执行重复项消除),而 UNION ALL BY NAME 遵循多重集语义。

INTERSECT

INTERSECT 子句可用于选择在**两个**查询结果中都出现的所有行。

原始 INTERSECT (集合语义)

原始 INTERSECT 执行重复项消除,因此只返回唯一行。

SELECT * FROM range(2) t1(x)
INTERSECT
SELECT * FROM range(6) t2(x);
x
0
1

INTERSECT ALL (多重集语义)

INTERSECT ALL 遵循多重集语义,因此返回重复项。

SELECT unnest([5, 5, 6, 6, 6, 6, 7, 8]) AS x
INTERSECT ALL
SELECT unnest([5, 6, 6, 7, 7, 9]);
x
5
6
6
7

EXCEPT

EXCEPT 子句可用于选择**仅**在左侧查询中出现的所有行。

原始 EXCEPT (集合语义)

原始 EXCEPT 遵循集合语义,因此它执行重复项消除,只返回唯一行。

SELECT * FROM range(5) t1(x)
EXCEPT
SELECT * FROM range(2) t2(x);
x
2
3
4

EXCEPT ALL (多重集语义)

EXCEPT ALL 使用多重集语义

SELECT unnest([5, 5, 6, 6, 6, 6, 7, 8]) AS x
EXCEPT ALL
SELECT unnest([5, 6, 6, 7, 7, 9]);
x
5
8
6
6

语法