应用 (Azure 流分析)

使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。 表值函数作为右输入,外部表表达式作为左输入。 为左侧输入的每一行计算右侧输入,并合并生成的行以得到最终输出。 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:记录中 属性的值。

示例

在此示例中,扩展收费站方案时,我们假设汽车可以具有多个牌照 (例如,一辆拖着拖车的汽车将具有两个) 。 Cross/outer apply 可用于平整此数组,即,为每个牌照获取一行。

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  
  

查询可以修改为使用 outer apply,以便还跟踪没有任何牌照的汽车。

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