次の方法で共有


申し込む

✅ 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 つあります。 GetArrayElementsGetRecordProperties です

構文

  
<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