申请

✅ Azure 流分析 ✅ 构造事件流

APPLY 运算符允许为查询的外部表表达式返回的每一行调用表值函数。 表值函数充当右输入,外部表表达式充当左输入。 为左侧输入中的每一行计算右输入,生成的行将合并为最终输出。 APPLY 运算符生成的列列表是左侧输入中的列集,后跟右输入返回的列列表。

应用有两种形式:CROSS APPLY 和 OUTER APPLY。

CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。 CROSS APPLY 的结果不能用作 TIMESTAMP BY 的目标值。 但是,可以使用一个执行 CROSS APPLY 的 Azure 流分析作业,并使用第二个作业来执行 TIMESTAMP BY。

OUTER APPLY 返回生成结果集的行和不具有表值函数生成的列中的 NULL 值的行。

Azure 流分析中提供了两个表值函数,可帮助处理数组和记录类型字段。 它们是 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 函数,结果将是包含两个字段的记录:

  • ArrayIndex:数组中元素的索引

  • ArrayValue:数组中元素的值。

对于 GetRecordProperties 函数,结果将是包含两个字段的记录:

  • PropertyName:记录中属性的名称。

  • PropertyValue:记录中属性的值。

例子

在此示例中,延长收费站方案,我们假设汽车可以拥有多个车牌(例如,一辆拖拖车的汽车将有两个)。 交叉/外部应用可用于平展此数组,即为每个牌照获取一行。

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