JOIN子句
Join通过使用一个或多个表的公共值合并来自一个或多个表的列来生成新表。 它是支持SQL的数据库中的常见操作,它对应于 关系代数 加入。 一个表连接的特殊情况通常被称为 “self-join”.
语法:
SELECT <expr_list>
FROM <left_table>
[GLOBAL] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI|ANY|ASOF] JOIN <right_table>
(ON <expr_list>)|(USING <column_list>) ...
从表达式 ON
从子句和列 USING
子句被称为 “join keys”. 除非另有说明,加入产生一个 笛卡尔积 从具有匹配的行 “join keys”,这可能会产生比源表更多的行的结果。
支持的联接类型
所有标准 SQL JOIN 支持类型:
INNER JOIN
,只返回匹配的行。LEFT OUTER JOIN
,除了匹配的行之外,还返回左表中的非匹配行。RIGHT OUTER JOIN
,除了匹配的行之外,还返回右表中的非匹配行。FULL OUTER JOIN
,除了匹配的行之外,还会返回两个表中的非匹配行。CROSS JOIN
,产生整个表的笛卡尔积, “join keys” 是 不 指定。
JOIN
没有指定类型暗指 INNER
. 关键字 OUTER
可以安全地省略。 替代语法 CROSS JOIN
在指定多个表 FROM 用逗号分隔。
ClickHouse中提供的其他联接类型:
LEFT SEMI JOIN
和RIGHT SEMI JOIN
,白名单 “join keys”,而不产生笛卡尔积。LEFT ANTI JOIN
和RIGHT ANTI JOIN
,黑名单 “join keys”,而不产生笛卡尔积。LEFT ANY JOIN
,RIGHT ANY JOIN
andINNER ANY JOIN
, partially (for opposite side ofLEFT
andRIGHT
) or completely (forINNER
andFULL
) disables the cartesian product for standardJOIN
types.ASOF JOIN
andLEFT ASOF JOIN
, joining sequences with a non-exact match.ASOF JOIN
usage is described below.
严格
可以使用以下方式复盖默认的严格性值 join_default_strictness 设置。
Also the behavior of ClickHouse server for ANY JOIN
operations depends on the any_join_distinct_right_table_keys setting.
ASOF JOIN使用
ASOF JOIN
当您需要连接没有完全匹配的记录时非常有用。
该算法需要表中的特殊列。 该列需要满足:
- 必须包含有序序列。
- 可以是以下类型之一: Int*,UInt*, Float*, Date, DateTime, Decimal*.
- 不能是
JOIN
子句中唯一的列
语法 ASOF JOIN ... ON
:
SELECT expressions_list
FROM table_1
ASOF LEFT JOIN table_2
ON equi_cond AND closest_match_cond
您可以使用任意数量的相等条件和一个且只有一个最接近的匹配条件。 例如, SELECT count() FROM table_1 ASOF LEFT JOIN table_2 ON table_1.a == table_2.b AND table_2.t <= table_1.t
.
支持最接近匹配的运算符: >
, >=
, <
, <=
.
语法 ASOF JOIN ... USING
:
SELECT expressions_list
FROM table_1
ASOF JOIN table_2
USING (equi_column1, ... equi_columnN, asof_column)
table_1.asof_column >= table_2.asof_column
中, ASOF JOIN
使用 equi_columnX
来进行条件匹配, asof_column
用于JOIN最接近匹配。 asof_column
列总是在最后一个 USING
条件中。
例如,参考下表:
table_1 table_2 event | ev_time | user_id event | ev_time | user_id ----------|---------|---------- ----------|---------|---------- ... ... event_1_1 | 12:00 | 42 event_2_1 | 11:59 | 42 ... event_2_2 | 12:30 | 42 event_1_2 | 13:00 | 42 event_2_3 | 13:00 | 42 ... ...
ASOF JOIN
会从 table_2
中的用户事件时间戳找出和 table_1
中用户事件时间戳中最近的一个时间戳,来满足最接近匹配的条件。如果有得话,则相等的时间戳值是最接近的值。在此例中,user_id
列可用于条件匹配,ev_time
列可用于最接近匹配。在此例中,event_1_1
可以 JOIN event_2_1
,event_1_2
可以JOIN event_2_3
,但是 event_2_2
不能被JOIN。
ASOF JOIN
在 JOIN 表引擎中 不受 支持。