APPLY (Azure Stream Analytics)
O operador APPLY permite invocar uma função com valor de tabela para cada linha retornada por uma expressão de tabela externa de uma consulta. A função com valor de tabela age como a entrada à direita e a expressão de tabela exterior age como a entrada à esquerda. A entrada à direita é avaliada para cada linha a começar da entrada à esquerda e as linhas produzidas são combinadas para a saída final. A lista de colunas produzida pelo operador APPLY é o conjunto de colunas na entrada à esquerda, seguido pela lista de colunas retornadas pela entrada à direita.
Há duas formas de APPLY: CROSS APPLY e OUTER APPLY.
CROSS APPLY só retorna linhas da tabela exterior que produzem um conjunto de resultados da função com valor de tabela. O resultado de um CROSS APPLY não pode ser usado como o valor de destino do TIMESTAMP BY. No entanto, você pode usar um trabalho do Azure Stream Analytics que executa CROSS APPLY e usar um segundo trabalho para executar o TIMESTAMP BY.
OUTER APPLY retorna linhas que produzem um conjunto de resultados e linhas que não o fazem, com valores NULL nas colunas produzidas pela função com valor de tabela.
Há duas funções com valor de tabela disponíveis no Azure Stream Analytics para facilitar o trabalho com campos do tipo Matriz e Registro. Eles são GetArrayElements e GetRecordProperties.
Sintaxe
<input> {CROSS | OUTER} APPLY <elements_selector>
<input> ::= input_name | input_alias
<elements_selector> ::=
{GetArrayElements | GetRecordProperties} (<column_name>) AS element_name
Argumentos
input_name | input_alias
O nome ou alias do fluxo de entrada.
column_name
O nome de uma coluna do fluxo de entrada.
Element_name
O nome da nova coluna que contém o resultado da função com valor de tabela.
Tipos de retorno
A saída é um registro que contém o conteúdo inicial e um registro 'element_name', que contém o resultado da função com valor de tabela.
Para a função GetArrayElements, o resultado será um registro com dois campos:
ArrayIndex: o índice do elemento na matriz
ArrayValue: o valor do elemento na matriz.
Para a função GetRecordProperties, o resultado será um registro com dois campos:
PropertyName: o nome da propriedade no registro.
PropertyValue: o valor da propriedade no registro.
Exemplos
Neste exemplo, estendendo o cenário de pedágio, presumimos que os carros podem ter mais de uma placa (por exemplo, um carro rebocando um reboque teria dois). Cross/outer apply podem ser usadas para mesclar essa matriz, ou seja, obter uma linha por placa.
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
A consulta pode ser modificada para usar outer apply e também manter um registro de carros não emplacados.
SELECT e.TollId, e.EntryTime,
flat.ArrayValue AS licensePlate, flat.ArrayIndex AS licensePlateIndex
FROM input AS e
OUTER APPLY GetArrayElements(e.Licenses) AS flat
Outro exemplo usando matrizes aninhadas (matriz de matrizes).
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