join 运算符
通过匹配每个表中指定列的值,合并两个表的行以组成新表。
Kusto 查询语言 (KQL) 提供了许多类型的联接,每种联接都以不同的方式影响结果表中的架构和行。 例如,如果使用 inner
联接,则该表具有与左表相同的列,再加上右表中的列。 为获得最佳性能,如果某个表始终小于另一个表,则将其用作 join
运算符的左侧。
下图提供了每种联接执行的操作的可视化表示形式。 阴影的颜色代表返回的列,而阴影的区域代表返回的行。
语法
LeftTable |
join
[ kind
=
JoinFlavor ] [ Hints ] (
RightTable)
on
Conditions
详细了解语法约定。
参数
客户 | 类型 | 必需 | 说明 |
---|---|---|---|
LeftTable | string |
✔️ | 要合并其行的左侧表或表格表达式(有时称为外部表)。 表示为 $left 。 |
JoinFlavor | string |
要执行的联接类型:innerunique 、inner 、leftouter 、rightouter 、fullouter 、leftanti 、rightanti 、leftsemi 、rightsemi 。 默认为 innerunique 。 有关联接风格的详细信息,请参阅返回结果。 |
|
提示 | string |
零个或多个(以空格分隔)以 Name = Value 形式表示的联接提示,用于控制行匹配操作和执行计划的行为。 有关详细信息,请参阅提示。 |
|
RightTable | string |
✔️ | 要合并其行的右侧表或表格表达式(有时称为内部表)。 表示为 $right 。 |
条件 | string |
✔️ | 确定 LeftTable 中的行如何与 RightTable 中的行匹配。 如果要匹配的列在这两个表中具有相同的名称,请使用 ON ColumnName 语法。 否则,请使用 ON $left. LeftColumn == $right. RightColumn 语法。 若要指定多个条件,可以使用“and”关键字,也可以使用逗号分隔它们。 如果使用逗号,则将使用“and”逻辑运算符来计算条件。 |
提示
为获得最佳性能,如果某个表始终小于另一个表,则将其用作 join 的左侧。
提示
提示键 | 值 | 说明 |
---|---|---|
hint.remote |
auto , left , local , right |
请参阅跨群集联接 |
hint.strategy=broadcast |
指定在群集节点上共享查询负载的方式。 | 请参阅广播联接 |
hint.shufflekey=<key> |
shufflekey 查询使用键将数据分区,在群集节点上共享查询负载。 |
请参阅 shuffle 查询 |
hint.strategy=shuffle |
shuffle 策略查询会在群集节点上共享查询负载,其中的每个节点将处理一个数据分区。 |
请参阅 shuffle 查询 |
名称 | 值 | 说明 |
---|---|---|
hint.remote |
auto , left , local , right |
|
hint.strategy=broadcast |
指定在群集节点上共享查询负载的方式。 | 请参阅广播联接 |
hint.shufflekey=<key> |
shufflekey 查询使用键将数据分区,在群集节点上共享查询负载。 |
请参阅 shuffle 查询 |
hint.strategy=shuffle |
shuffle 策略查询会在群集节点上共享查询负载,其中的每个节点将处理一个数据分区。 |
请参阅 shuffle 查询 |
注意
联接提示不会更改 join
的语义,但可能会影响性能。
返回
返回架构和行取决于联接风格。 联接风格是通过 kind 关键字指定的。 下表显示了受支持的联接风格。 若要查看特定联接风格的示例,请选择“联接风格”列中的链接。
联接风格 | 返回 | 图示 |
---|---|---|
innerunique(默认) | 执行左侧重复数据删除的内联 架构:两个表中的所有列,包括匹配的键 行:左表中与右表中的行匹配的行,其中已删除重复的行 |
|
inner | 标准内联 架构:两个表中的所有列,包括匹配的键 行:仅限两个表中的匹配行 |
|
leftouter | 左外部联接 架构:两个表中的所有列,包括匹配的键 行:左表中的所有记录,并且仅匹配右表中的行 |
|
rightouter | 右外部联接 架构:两个表中的所有列,包括匹配的键 行:右表中的所有记录,并且仅匹配左表中的行 |
|
fullouter | 完全外联 架构:两个表中的所有列,包括匹配的键 行:两个表中的所有记录,其中不匹配的单元格填充为 null |
|
leftsemi | 左半联 架构:左表中的所有列 行:左表中所有与右表中记录相匹配的记录 |
|
leftanti , anti , leftantisemi |
左反联接和半变体 架构:左表中的所有列 行:左表中所有与右表中记录不匹配的记录 |
|
rightsemi | 右半联 架构:右表中的所有列 行:右表中所有与左表中记录相匹配的记录 |
|
rightanti , rightantisemi |
右反联接和半变体 架构:右表中的所有列 行:右表中所有与左表中记录不匹配的记录 |
交叉联接
KQL 不提供交叉联接风格。 但是,你可使用占位符键方法实现交叉联接效果。
在以下示例中,占位符键被添加到两个表中,然后用于内部联接操作,从而有效实现类似交叉联接的行为:
X | extend placeholder=1 | join kind=inner (Y | extend placeholder=1) on placeholder