✅ Azure Stream Analytics ✅ Fabric Eventstream
APPLY 연산자를 사용하면 쿼리의 외부 테이블 식에서 반환된 각 행에 대해 테이블 반환 함수를 호출할 수 있습니다. 테이블 반환 함수는 오른쪽 입력으로 작동하고 외부 테이블 식은 왼쪽 입력으로 작동합니다. 오른쪽 입력은 왼쪽 입력의 각 행에 대해 평가되고 생성된 행은 최종 출력을 위해 결합됩니다. APPLY 연산자가 생성하는 열 목록은 왼쪽 입력의 열 집합과 오른쪽 입력에서 반환된 열 목록입니다.
APPLY에는 CROSS APPLY 및 OUTER APPLY의 두 가지 형태가 있습니다.
CROSS APPLY는 테이블 반환 함수로부터 결과 집합을 생성하는 외부 테이블의 행만 반환합니다. CROSS APPLY의 결과는 TIMESTAMP BY의 대상 값으로 사용할 수 없습니다. 그러나 CROSS APPLY를 수행하는 하나의 Azure Stream Analytics 작업을 사용하고 두 번째 작업을 사용하여 TIMESTAMP BY를 수행할 수 있습니다.
OUTER APPLY는 결과 집합을 생성하는 행과 그렇지 않은 행을 모두 반환하며, 테이블 반환 함수에서 생성된 열에 NULL 값이 있습니다.
Azure Stream Analytics에는 배열 및 레코드 형식 필드 작업을 용이하게 하기 위해 사용할 수 있는 두 가지 테이블 반환 함수가 있습니다. 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 함수의 경우 결과는 다음 두 필드가 있는 레코드가 됩니다.
ArrayIndex: 배열에 있는 요소의 인덱스입니다.
ArrayValue: 배열에 있는 요소의 값입니다.
GetRecordProperties 함수의 경우 결과는 다음 두 필드가 있는 레코드가 됩니다.
PropertyName: 레코드에 있는 속성의 이름입니다.
PropertyValue: 레코드의 속성 값입니다.
예시
이 예제에서 tollbooth 시나리오를 확장하면 자동차에 둘 이상의 번호판이 있을 수 있다고 가정합니다(예: 트레일러를 견인하는 자동차는 두 개임). 크로스/외부 적용을 사용하여 이 배열을 평면화할 수 있습니다. 즉, 번호판당 하나의 행을 가져옵니다.
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