✅ Azure Stream Analytics ✅ Fabric Eventstream
APPLY 演算子を使用すると、クエリの外部テーブル式によって返される各行に対してテーブル値関数を呼び出すことができます。 テーブル値関数は右入力として機能し、外側のテーブル式は左入力として機能します。 右側の入力は左側の入力から行ごとに評価され、生成された行は最終的な出力用に結合されます。 APPLY 演算子によって生成される列の一覧は、左側の入力の列のセットの後に、右側の入力によって返される列のリストです。
APPLY には、CROSS APPLY と OUTER APPLY の 2 つの形式があります。
CROSS APPLY では、外部テーブルの行のうち、テーブル値関数から結果セットを生成する行のみが返されます。 CROSS APPLY の結果を TIMESTAMP BY のターゲット値として使用することはできません。 ただし、CROSS APPLY を実行する 1 つの Azure Stream Analytics ジョブを使用し、2 つ目のジョブを使用して TIMESTAMP BY を実行できます。
OUTER APPLY は、結果セットを生成する行と返さない行の両方を返します。テーブル値関数によって生成される列には NULL 値が含まれます。
配列型フィールドとレコード型フィールドの操作を容易にするために、Azure Stream Analytics にはテーブル値関数が 2 つあります。 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 関数の場合、結果は次の 2 つのフィールドを持つレコードになります。
ArrayIndex: 配列内の要素のインデックス
ArrayValue: 配列内の要素の値。
GetRecordProperties 関数の場合、結果は次の 2 つのフィールドを持つレコードになります。
PropertyName: レコード内のプロパティの名前。
PropertyValue: レコード内のプロパティの値。
例示
この例では、tollbooth シナリオを拡張して、車が複数のナンバー プレートを持つことができます (たとえば、トレーラーを牽引する車には 2 つがあると仮定します)。 クロス/外側の適用を使用して、この配列をフラット化できます。つまり、ライセンス プレートごとに 1 行を取得します。
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