union 運算子

取得兩個或以上的資料表並傳回這些資料表中的資料列。

語法

[ T| ] union [ UnionParameters ] [kind=outer|inner] [withsource=ColumnName] [|trueisfuzzy=false] 數據表

深入瞭解 語法慣例

注意

您可以使用 set 語句透過用戶端要求屬性best_effort將要求屬性設定為 true,藉此改變運算子的作業union。 當此屬性設定為 true時, union 運算符會忽略模糊解析和聯機失敗,以執行任何要「聯集」的子表達式,並在查詢狀態結果中產生警告。

參數

名稱 類型 必要 Description
T string 輸入表格式表達式。
UnionParameters string 名稱=形式的零個或多個空格分隔參數,可控制數據列比對作業和執行計劃的行為。 請參閱 支援的等位參數
kind string innerouterinner 會導致結果具有所有輸入數據表通用的數據行子集。 outer 會導致結果具有任何輸入中發生的所有數據行。 輸入資料欄未定義的儲存格會設定為 null。 預設為 outer

使用 outer時,結果會包含任何輸入中發生的所有數據行,每個名稱和類型都會有一個數據行。 這表示,如果數據行出現在多個數據表中,而且具有多個類型,則其結果中每個類型都有對應的數據行。 此數據行名稱後綴為 『_』,後面接著源數據行 類型
withsource=ColumnName string 如果指定,輸出會包含名為 ColumnName 的數據行,其值表示哪些源數據表已參與每個數據列。 如果查詢有效地參考來自多個資料庫的數據表,包括預設資料庫,則此數據行的值具有資料庫限定的數據表名稱。 如果參考多個叢集,叢集和資料庫限定性會出現在 值中。
isfuzzy bool 如果設定為 true,則允許等位位的模糊解析。 聯集來源集會減少為一組數據表參考,這些參考存在於且可在分析查詢並準備執行時存取。 如果找到至少一個這類數據表,任何解析失敗會在查詢狀態結果中產生警告,但不會防止查詢執行。 如果未成功解決,查詢會傳回錯誤。 預設為 false

isfuzzy=true 僅適用於 union 來源解析階段。 決定源數據表集之後,將不會隱藏可能的其他查詢失敗。
資料表 string 一或多個逗號分隔數據表參考、以括弧括住的查詢表達式,或以通配符指定的一組數據表。 例如,E* 會形成資料庫中所有資料表的聯集,其名稱以 E 開頭。

支援的等位參數

名稱 類型 必要 Description
hint.concurrency int 提示系統:union 運算子有多少個並行子查詢應該以平行方式執行。 默認值是叢集單一節點上的CPU核心數目, (2到16) 。
hint.spread int 提示系統並行 union 子查詢執行應使用多少個節點。 預設值是 1。
名稱 類型 必要 Description
T string 輸入表格式表達式。
kind string innerouterinner 會導致結果具有所有輸入數據表通用的數據行子集。 outer 會導致結果具有任何輸入中發生的所有數據行。 輸入資料欄未定義的儲存格會設定為 null。 預設為 outer

使用 outer時,結果會包含任何輸入中發生的所有數據行,每個名稱和類型都會有一個數據行。 這表示,如果數據行出現在多個數據表中,而且具有多個類型,則其結果中每個類型都有對應的數據行。 此數據行名稱後綴為 『_』,後面接著源數據行 類型
withsource=ColumnName string 如果指定,輸出會包含名為 ColumnName 的數據行,其值表示哪些源數據表已參與每個數據列。 如果查詢有效地參考來自多個資料庫的數據表,包括預設資料庫,則此數據行的值具有資料庫限定的數據表名稱。 如果參考多個叢集,叢集和資料庫限定性會出現在 值中。
isfuzzy bool 如果設定為 true,則允許等位位的模糊解析。 聯集來源集會減少為一組數據表參考,這些參考存在於且可在分析查詢並準備執行時存取。 如果找到至少一個這類數據表,任何解析失敗會在查詢狀態結果中產生警告,但不會防止查詢執行。 如果未成功解決,查詢會傳回錯誤。 不過,在跨工作區和跨應用程式查詢中,如果找不到任何工作區或應用程式,查詢將會失敗。 預設為 false

isfuzzy=true 僅適用於 union 來源解析階段。 決定源數據表集之後,將不會隱藏可能的其他查詢失敗。
資料表 string 一或多個逗號分隔數據表參考、以括弧括住的查詢表達式,或以通配符指定的一組數據表。 例如,E* 會形成資料庫中所有資料表的聯集,其名稱以 E 開頭。

知道資料表的清單時,請避免使用萬用字元。 某些工作區包含非常大量的資料表,會導致執行效率不佳。 資料表也可能會隨著導致非預期結果的時間而增加。

注意

  • union如果屬性為 關鍵詞,view範圍可以包含 let 語句
  • 範圍 union 不會包含 函式。 若要包含函式,請使用 view 關鍵詞定義 let 語句
  • 不保證聯集的長條出現順序,但如果每個腳有運算符,則會排序每一 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