APPLY (Azure Stream Analytics)
Operator APPLY umożliwia wywołanie funkcji z wartością tabeli dla każdego wiersza zwróconego przez zewnętrzne wyrażenie tabeli zapytania. Funkcja z wartością tabeli działa jako prawe dane wejściowe, a zewnętrzne wyrażenie tabeli działa jako dane wejściowe po lewej stronie. Prawe dane wejściowe są oceniane dla każdego wiersza z lewej strony wejściowej, a utworzone wiersze są łączone dla końcowych danych wyjściowych. Lista kolumn generowanych przez operator APPLY to zestaw kolumn w lewym wejściu, a następnie lista kolumn zwracanych przez prawe dane wejściowe.
Istnieją dwie formy APPLY: CROSS APPLY i OUTER APPLY.
Funkcja CROSS APPLY zwraca tylko wiersze z tabeli zewnętrznej, które generują zestaw wyników z funkcji z wartością tabeli. Wynik FUNKCJI CROSS APPLY nie może być używany jako wartość docelowa TIMESTAMP BY. Można jednak użyć jednego zadania usługi Azure Stream Analytics, które wykonuje operację CROSS APPLY, i użyć drugiego zadania do wykonania sygnatury CZASOWEJ BY.
Funkcja OUTER APPLY zwraca oba wiersze, które generują zestaw wyników, oraz wiersze, które nie mają wartości NULL w kolumnach generowanych przez funkcję z wartością tabeli.
W usłudze Azure Stream Analytics są dostępne dwie funkcje z wartościami tabel, które ułatwiają pracę z polami typu tablicy i rekordu. Są to GetArrayElements i GetRecordProperties.
Składnia
<input> {CROSS | OUTER} APPLY <elements_selector>
<input> ::= input_name | input_alias
<elements_selector> ::=
{GetArrayElements | GetRecordProperties} (<column_name>) AS element_name
Argumenty
input_name | input_alias
Nazwa lub alias strumienia wejściowego.
Column_name
Nazwa kolumny strumienia wejściowego.
element_name
Nazwa nowej kolumny zawierającej wynik funkcji z wartością tabeli.
Typy zwracane
Dane wyjściowe to rekord zawierający początkowy ładunek i rekord "element_name", który zawiera wynik funkcji z wartością tabeli.
W przypadku funkcji GetArrayElements wynik będzie rekordem z dwoma polami:
ArrayIndex: indeks elementu w tablicy
ArrayValue: wartość elementu w tablicy.
W przypadku funkcji GetRecordProperties wynik będzie rekordem z dwoma polami:
PropertyName: nazwa właściwości w rekordzie.
PropertyValue: wartość właściwości w rekordzie.
Przykłady
W tym przykładzie, rozszerzając scenariusz tollbooth, zakładamy, że samochody mogą mieć więcej niż jedną tablicę rejestracyjną (np. holowanie przyczepy będzie miało dwa). Zastosowanie krzyżowe/zewnętrzne może służyć do spłaszczenia tej tablicy, tj. uzyskać jeden wiersz na tablicę rejestracyjną.
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
Kwerendę można zmodyfikować w celu zastosowania zewnętrznego, aby śledzić również samochody bez żadnych tablic rejestracyjnych.
SELECT e.TollId, e.EntryTime,
flat.ArrayValue AS licensePlate, flat.ArrayIndex AS licensePlateIndex
FROM input AS e
OUTER APPLY GetArrayElements(e.Licenses) AS flat
Inny przykład użycia zagnieżdżonych tablic (tablic tablic).
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