APPLY (Azure Stream Analytics)

Med operatorn APPLY kan du anropa en tabellvärdesfunktion för varje rad som returneras av ett yttre tabelluttryck för en fråga. Funktionen table-valued fungerar som rätt indata och det yttre tabelluttrycket fungerar som vänster indata. Rätt indata utvärderas för varje rad från den vänstra indatan och de rader som skapas kombineras för de slutliga utdata. Listan över kolumner som skapas av APPLY-operatorn är uppsättningen kolumner i den vänstra indatan följt av listan över kolumner som returneras av rätt indata.

Det finns två former av APPLY: CROSS APPLY och OUTER APPLY.

CROSS APPLY returnerar endast rader från den yttre tabellen som genererar en resultatuppsättning från funktionen table-valued. Resultatet av en CROSS APPLY kan inte användas som målvärde för TIMESTAMP BY. Du kan dock använda ett Azure Stream Analytics-jobb som utför CROSS APPLY och använda ett andra jobb för att utföra TIMESTAMP BY.

OUTER APPLY returnerar båda raderna som producerar en resultatuppsättning och rader som inte gör det, med NULL-värden i kolumnerna som skapas av tabellvärdesfunktionen.

Det finns två tabellvärdesfunktioner i Azure Stream Analytics för att underlätta arbetet med fälten Matris och Posttyp. De är GetArrayElements och GetRecordProperties.

Syntax

  
<input> {CROSS | OUTER} APPLY <elements_selector>  
  
<input> ::= input_name |  input_alias  
  
<elements_selector> ::=   
{GetArrayElements | GetRecordProperties} (<column_name>) AS element_name  
  

Argument

input_name | input_alias

Namnet eller aliaset för indataströmmen.

column_name

Namnet på en kolumn i indataströmmen.

element_name

Namnet på den nya kolumnen som innehåller resultatet av funktionen table-valued.

Returtyper

Utdata är en post som innehåller den första nyttolasten och posten "element_name", som innehåller resultatet av tabellvärdesfunktionen.

För funktionen GetArrayElements blir resultatet en post med två fält:

  • ArrayIndex: index för elementet i matrisen

  • ArrayValue: värdet för elementet i matrisen.

För funktionen GetRecordProperties blir resultatet en post med två fält:

  • PropertyName: namnet på egenskapen i posten.

  • PropertyValue: värdet för egenskapen i posten.

Exempel

I det här exemplet, som utökar tollbooth-scenariot, antar vi att bilar kan ha mer än en registreringsskylt (t.ex. en bil som bogserar en släpvagn skulle ha två). Kors-/yttre tillämpning kan användas för att platta ut den här matrisen, d.v.s. få en rad per registreringsskylt.

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  
  

Frågan kan ändras för att använda yttre tillämpning för att även hålla reda på bilar utan någon registreringsskylt.

SELECT e.TollId, e.EntryTime,   
flat.ArrayValue AS licensePlate, flat.ArrayIndex AS licensePlateIndex  
   FROM input AS e   
   OUTER APPLY GetArrayElements(e.Licenses) AS flat  
  

Ett annat exempel med kapslade matriser (matriser med matriser).

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