union 运算符
获取两个或多个表,并返回表中的所有行。
语法
[ T |
] union
[ UnionParameters ] [kind=
inner
|outer
] [withsource=
ColumnName] [isfuzzy=
true
|false
] Tables
[ T |
] union
[kind=
inner
|outer
] [withsource=
ColumnName] [isfuzzy=
true
|false
] 表
详细了解语法约定。
参数
客户 | 类型 | 必需 | 说明 |
---|---|---|---|
T | string |
输入表格表达式。 | |
UnionParameters | string |
零个或零个以上(以空格分隔)以 Name = Value 形式表示的参数,用于控制行匹配操作和执行计划的行为。 请参阅支持的联合参数。 |
|
kind |
string |
inner 或 outer 。 inner 导致结果包含所有输入表所共有列的子集。 outer 导致结果包含所有出现在任何输入中的列。 未由输入行定义的单元格设置为 null 。 默认为 outer 。使用 outer 时,结果将包含出现在任何输入中的所有列,每个名称和类型实例各占一列。 这意味着,如果某个列出现在多个表中且具有多个类型,则在 union 的结果中,对于每个类型,它都有一个对应的列。 此列名称将以“_”作为后缀,后跟源列类型。 |
|
withsource= ColumnName |
string |
如果指定了此项,则输出将包括一个名为 ColumnName 的列,其值指示哪个源表提供了每一行。 如果查询有效引用了多个数据库(包括默认数据库)中的表,则此列的值将具有使用数据库进行限定的表名。 如果引用了多个群集,则值中将存在群集和数据库限定条件。 | |
isfuzzy |
bool |
如果设置为 true ,则允许对 union 支线进行模糊解析。 在分析查询和准备执行时,union 源的集合被缩减为当时存在并且可供访问的一组表引用。 如果至少找到一个此类表,任何解析失败都会在查询状态结果中产生警告,但不会阻止查询执行。 如果没有任何解析成功,则查询会返回错误。 默认为 false 。isfuzzy=true 仅适用于 union 源解析阶段。 确定源表的集合后,不会隐藏可能的其他查询失败。 |
|
表 | string |
一个或多个逗号分隔表引用、用括号括住的查询表达式,或用通配符指定的表集。 例如,E* 将构成数据库中所有名称以 E 开头的表的并集。 |
支持的联合参数
名称 | 类型 | 必需 | 说明 |
---|---|---|---|
hint.concurrency |
int |
提示系统应并行执行 union 运算符的多少个并发子查询。 默认值为群集单个节点上的 CPU 核心数(2 到 16)。 |
|
hint.spread |
int |
提示系统并发的 union 子查询执行应使用多少个节点。 默认值为 1。 |
名称 | 类型 | 必需 | 说明 |
---|---|---|---|
T | string |
输入表格表达式。 | |
kind |
string |
inner 或 outer 。 inner 导致结果包含所有输入表所共有列的子集。 outer 导致结果包含所有出现在任何输入中的列。 未由输入行定义的单元格设置为 null 。 默认为 outer 。使用 outer 时,结果将包含出现在任何输入中的所有列,每个名称和类型实例各占一列。 这意味着,如果某个列出现在多个表中且具有多个类型,则在 union 的结果中,对于每个类型,它都有一个对应的列。 此列名称将以“_”作为后缀,后跟源列类型。 |
|
withsource= ColumnName |
string |
如果指定了此项,则输出将包括一个名为 ColumnName 的列,其值指示哪个源表提供了每一行。 如果查询有效引用了多个数据库(包括默认数据库)中的表,则此列的值将具有使用数据库进行限定的表名。 如果引用了多个群集,则值中将存在群集和数据库限定条件。 | |
isfuzzy |
bool |
如果设置为 true ,则允许对 union 支线进行模糊解析。 在分析查询和准备执行时,union 源的集合被缩减为当时存在并且可供访问的一组表引用。 如果至少找到一个此类表,任何解析失败都会在查询状态结果中产生警告,但不会阻止查询执行。 如果没有任何解析成功,则查询会返回错误。 但是,在跨工作区和跨应用查询中,如果未找到任何工作区或应用,则查询将失败。 默认为 false 。isfuzzy=true 仅适用于 union 源解析阶段。 确定源表的集合后,不会隐藏可能的其他查询失败。 |
|
表 | string |
一个或多个逗号分隔表引用、用括号括住的查询表达式,或用通配符指定的表集。 例如,E* 将构成数据库中所有名称以 E 开头的表的并集。表的列表已知时,请勿使用通配符。 某些工作区包含非常多的表,会导致执行效率低下。 还可能会随着时间的推移添加表,导致不可预测结果。 |
注意
返回
一个表,其中的行数与所有输入表中的行数相同。
示例
名称或列中包含字符串的表
union K* | where * has "Kusto"
数据库中名称以 K
开头的所有表中有任意列包括单词 Kusto
的行。
非重复计数
union withsource=SourceTable kind=outer Query, Command
| where Timestamp > ago(1d)
| summarize dcount(UserId)
过去一天已生成 Query
事件或 Command
事件的不同用户数。 在结果中,“SourceTable”列会指示“Query”或“Command”。
Query
| where Timestamp > ago(1d)
| union withsource=SourceTable kind=outer
(Command | where Timestamp > ago(1d))
| summarize dcount(UserId)
此效率更高的版本可生成相同结果。 它可在创建联合之前筛选每个表。
使用 isfuzzy=true
// Using union isfuzzy=true to access non-existing view:
let View_1 = view () { print x=1 };
let View_2 = view () { print x=1 };
let OtherView_1 = view () { print x=1 };
union isfuzzy=true
(View_1 | where x > 0),
(View_2 | where x > 0),
(View_3 | where x > 0)
| count
输出
计数 |
---|
2 |
观察查询状态 - 返回以下警告:Failed to resolve entity 'View_3'
// Using union isfuzzy=true and wildcard access:
let View_1 = view () { print x=1 };
let View_2 = view () { print x=1 };
let OtherView_1 = view () { print x=1 };
union isfuzzy=true View*, SomeView*, OtherView*
| count
输出
计数 |
---|
3 |
观察查询状态 - 返回以下警告:Failed to resolve entity 'SomeView*'
源列类型不匹配
let View_1 = view () { print x=1 };
let View_2 = view () { print x=toint(2) };
union withsource=TableName View_1, View_2
输出
TableName | x_long | x_int |
---|---|---|
View_1 | 1 | |
View_2 | 2 |
let View_1 = view () { print x=1 };
let View_2 = view () { print x=toint(2) };
let View_3 = view () { print x_long=3 };
union withsource=TableName View_1, View_2, View_3
输出
TableName | x_long1 | x_int | x_long |
---|---|---|---|
View_1 | 1 | ||
View_2 | 2 | ||
View_3 | 3 |
来自 View_1
的列 x
收到了后缀 _long
,并且因为结果架构中已存在名为 x_long
的列,所以对列名称执行了删除重复数据的操作,生成了新列 - x_long1