union 运算符

获取两个或多个表,并返回表中的所有行。

语法

[ T| ] union [ UnionParameters ] [kind=inner|outer] [withsource=ColumnName] [isfuzzy=true|false] Tables

详细了解语法约定

注意

可以使用 set 语句客户端请求属性,通过将 best_effort 请求属性设置为 true 来更改 union 运算符的操作。 当此属性设置为 true 时,union 运算符将忽略模糊解析和连接失败,以执行任何“联合”的子表达式,并在查询状态结果中生成警告。

参数

客户 类型​​ 必需 说明
T string 输入表格表达式。
UnionParameters string 零个或零个以上(以空格分隔)以 Name = Value 形式表示的参数,用于控制行匹配操作和执行计划的行为。 请参阅支持的联合参数
kind string innerouterinner 导致结果包含所有输入表所共有列的子集。 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 innerouterinner 导致结果包含所有输入表所共有列的子集。 outer 导致结果包含所有出现在任何输入中的列。 未由输入行定义的单元格设置为 null。 默认为 outer

使用 outer 时,结果将包含出现在任何输入中的所有列,每个名称和类型实例各占一列。 这意味着,如果某个列出现在多个表中且具有多个类型,则在 union 的结果中,对于每个类型,它都有一个对应的列。 此列名称将以“_”作为后缀,后跟源列类型
withsource=ColumnName string 如果指定了此项,则输出将包括一个名为 ColumnName 的列,其值指示哪个源表提供了每一行。 如果查询有效引用了多个数据库(包括默认数据库)中的表,则此列的值将具有使用数据库进行限定的表名。 如果引用了多个群集,则值中将存在群集和数据库限定条件。
isfuzzy bool 如果设置为 true,则允许对 union 支线进行模糊解析。 在分析查询和准备执行时,union 源的集合被缩减为当时存在并且可供访问的一组表引用。 如果至少找到一个此类表,任何解析失败都会在查询状态结果中产生警告,但不会阻止查询执行。 如果没有任何解析成功,则查询会返回错误。 但是,在跨工作区和跨应用查询中,如果未找到任何工作区或应用,则查询将失败。 默认为 false

isfuzzy=true 仅适用于 union 源解析阶段。 确定源表的集合后,不会隐藏可能的其他查询失败。
string 一个或多个逗号分隔表引用、用括号括住的查询表达式,或用通配符指定的表集。 例如,E* 将构成数据库中所有名称以 E 开头的表的并集。

表的列表已知时,请勿使用通配符。 某些工作区包含非常多的表,会导致执行效率低下。 还可能会随着时间的推移添加表,导致不可预测结果。

注意

  • union 范围可以包括 let 语句(如果使用 view 关键字设置属性)。
  • union 范围将不包括函数。 若要包括函数,请使用 view 关键字定义 let 语句
  • 不保证 union 支线出现的顺序(但如果每条支线有一个 order by 运算符,那么将对每条支线进行排序)。

返回

一个表,其中的行数与所有输入表中的行数相同。

示例

名称或列中包含字符串的表

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