我和一位同事一起研究了CROSS / OUTER APPLY个,我们正在努力寻找在哪里使用它们的真实例子.

我花了很多时间查看When should I use Cross Apply over Inner Join?和谷歌搜索,但主要(唯一)示例似乎非常奇怪(使用表中的行数来确定从另一个表中 Select 多少行).

我认为这个场景可能会从OUTER APPLY中受益:

联系人表(每个联系人包含一条记录)

但是,使用子查询、公共表表达式、OUTER JOINRANK()OUTER APPLY,它们的性能似乎都相同.我猜这意味着这个场景不适用于APPLY.

请分享一些现实生活中的例子,并帮助解释该功能!

推荐答案

APPLY的一些用途是...

1) Top N per group queries(对于某些基数可能更有效)

SELECT pr.name,
       pa.name
FROM   sys.procedures pr
       OUTER APPLY (SELECT TOP 2 *
                    FROM   sys.parameters pa
                    WHERE  pa.object_id = pr.object_id
                    ORDER  BY pr.name) pa
ORDER  BY pr.name,
          pa.name 

2)为外部查询中的每一行调用表值函数

SELECT *
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle)

3) Reusing a column alias

SELECT number,
       doubled_number,
       doubled_number_plus_one
FROM master..spt_values
CROSS APPLY (SELECT 2 * CAST(number AS BIGINT)) CA1(doubled_number)  
CROSS APPLY (SELECT doubled_number + 1) CA2(doubled_number_plus_one)  

4) Unpivoting more than one group of columns

假设1NF违反了表 struct ....

CREATE TABLE T
  (
     Id   INT PRIMARY KEY,

     Foo1 INT, Foo2 INT, Foo3 INT,
     Bar1 INT, Bar2 INT, Bar3 INT
  ); 

使用2008+VALUES语法的示例.

SELECT Id,
       Foo,
       Bar
FROM   T
       CROSS APPLY (VALUES(Foo1, Bar1),
                          (Foo2, Bar2),
                          (Foo3, Bar3)) V(Foo, Bar); 

2005年,可以使用UNION ALL.

SELECT Id,
       Foo,
       Bar
FROM   T
       CROSS APPLY (SELECT Foo1, Bar1 
                    UNION ALL
                    SELECT Foo2, Bar2 
                    UNION ALL
                    SELECT Foo3, Bar3) V(Foo, Bar);

Sql相关问答推荐

为什么在这种情况下我不能使用LAG函数?

如何在snowflake中进行SQL的反向填充

检索上一个星期四和上一个星期三

使用Kotlin Exposed SQL DSL Select 多个值并排序

DBeaver将过程中的属性列表转换为字符串

如何在SQL Server中统计按备注分组的记录数

返回UPSERT中的旧行值

我需要一个regexp_like来只验证字母D或T、数字和管道

更正用于判断错误组合的SQL

从给定数据中查找下一个工作日期

在 PostgreSQL 中生成时间序列查询

计算 ID 满足条件的次数

SQL Server: 将JSON对象数组转换为表格格式

添加一列并根据其他列值进行填充

我需要遍历权重值表并确定每个权重是否有效

以 15 分钟为间隔的使用情况SQL 查询

Postgres 条件求和函数

如何根据 Amazon Athena 中的多个列值删除重复行?

有没有一种方法可以将始终遵循序列的单个字段的值组合起来,以创建每个 ID 的所有移动?

如何在 Oracle 中获取此变量的值?