✅ 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:記錄中屬性的值。
範例
在此範例中,延伸收費站案例,我們假設汽車可以有一個以上的車牌(例如汽車拖車會有兩個)。 交叉/外部套用可用來平整此陣列,也就是每個車牌取得一列。
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
查詢可以修改為使用外部套用,以追蹤沒有車牌的汽車。
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