套用 (Azure 串流分析)
APPLY 運算子可讓您針對由查詢之外部資料表運算式所傳回的每個資料列,叫用資料表值函式。 資料表值函式會作為右方輸入,而外部資料表運算式作為左方輸入。 系統會針對左邊輸入中的每個資料列評估右邊輸入,然後結合所產生的資料列來產生最終輸出。 APPLY 運算子所產生的資料行清單,即為左方輸入中的資料行集合,其後為右方輸入所傳回的資料行清單。
APPLY 有兩種格式:CROSS APPLY 與 OUTER APPLY。
CROSS APPLY 所傳回的資料列,僅限於從資料表值函式產生結果集之外部資料表所傳回的資料列。 CROSS APPLY 的結果不能當做 TIMESTAMP BY的目標值使用。 不過,您可以使用一個執行 CROSS APPLY 的 Azure 串流分析作業,並使用第二個作業來執行 TIMESTAMP BY。
OUTER APPLY 則可傳回能產生結果集的資料列,以及不會產生結果集的資料列 (在資料表值函式所產生的欄位中會顯示 NULL 值)。
Azure 串流分析中有兩個數據表值函式可用來協助使用陣列和記錄類型欄位。 它們是 GetArrayElements 和 GetRecordProperties。
語法
<input> {CROSS | OUTER} APPLY <elements_selector>
<input> ::= input_name | input_alias
<elements_selector> ::=
{GetArrayElements | GetRecordProperties} (<column_name>) AS element_name
引數
input_name | input_alias
輸入資料流的名稱或別名。
column_name
輸入資料流之資料行的名稱。
element_name
包含資料表值函式結果的新資料行名稱。
傳回型別
輸出是包含初始承載和記錄 'element_name'的記錄,其中包含資料表值函式的結果。
針對 GetArrayElements 函式,結果將會是具有兩個欄位的記錄:
ArrayIndex:陣列中專案的索引
ArrayValue:陣列中元素的值。
針對 GetRecordProperties 函式,結果將會是具有兩個欄位的記錄:
PropertyName:記錄中的屬性名稱。
PropertyValue:記錄中屬性的值。
範例
在此範例中,我們假設汽車可以有一個以上的車牌 (例如汽車拖曳預告片會有兩個) 。 Cross/Outer Apply 可以用來扁平化此陣列,也就是,一個汽車牌照一個資料列。
CREATE TABLE input(TollId nvarchar(max), EntryTime datetime, Licenses array)
SELECT e.TollId, e.EntryTime, flat.ArrayValue AS licensePlate
FROM input AS e
CROSS APPLY GetArrayElements(e.Licenses) AS flat
您可以修改查詢來使用 Outer Apply,同時一併追蹤沒有任何汽車牌照的汽車。
SELECT e.TollId, e.EntryTime,
flat.ArrayValue AS licensePlate, flat.ArrayIndex AS licensePlateIndex
FROM input AS e
OUTER APPLY GetArrayElements(e.Licenses) AS flat
使用巢狀陣列 (陣列中有陣列) 的另一個範例。
WITH firstQuery AS (
SELECT input.TollId, input.EntryTime,
flat.ArrayIndex AS i1, flat.ArrayValue AS licenses
FROM input
CROSS APPLY GetArrayElements(input.ArrayOfArray) AS flat)
SELECT firstQuery.TollId, firstQuery.EntryTime, firstQuery.i1,
flat2.ArrayIndex AS i2, flat2.ArrayValue AS license
FROM firstQuery
CROSS APPLY GetArrayElements(firstQuery.licenses) AS flat2