首页 >数据库 >mysql教程 >在 SQL 中何时使用 CROSS APPLY 与 OUTER APPLY?

在 SQL 中何时使用 CROSS APPLY 与 OUTER APPLY?

DDD
DDD原创
2025-01-10 09:03:41158浏览

When to Use CROSS APPLY vs. OUTER APPLY in SQL?

SQL 中 CROSS APPLY 与 OUTER APPLY 的实际应用场景

SQL 中的 OUTER APPLY 和 CROSS APPLY 运算符提供了灵活的数据操作和复杂查询执行方式。以下是一些实际用例,演示了何时使用每个运算符:

CROSS APPLY

  • 分组查询 Top N 记录: CROSS APPLY 可以高效地检索每个分组中的前 N 条结果。例如:
<code class="language-sql">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 </code>
  • 为每一行调用表值函数: CROSS APPLY 可以多次调用表值函数,外层查询的每一行都作为输入。例如:
<code class="language-sql">SELECT *
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle)</code>

OUTER APPLY

  • 重用列别名: OUTER APPLY 允许重用列别名,无需创建临时表。例如:
<code class="language-sql">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)  </code>
  • 解开多个列组: OUTER APPLY 可以从扁平表中解开多组列。例如:
<code class="language-sql">CREATE TABLE T
  (
     Id INT PRIMARY KEY,
     Foo1 INT, Bar1 INT,
     Foo2 INT, Bar2 INT,
     Foo3 INT, Bar3 INT
  );</code>

使用 VALUES 语法 (SQL Server 2008 ):

<code class="language-sql">SELECT Id,
       Foo,
       Bar,
       GrpName
FROM   T
       CROSS APPLY (VALUES('1', Foo1, Bar1),
                          ('2', Foo2, Bar2),
                          ('3', Foo3, Bar3)) V(GrpName, Foo, Bar); </code>

以上是在 SQL 中何时使用 CROSS APPLY 与 OUTER APPLY?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn