首页 >数据库 >mysql教程 >OUTER/CROSS APPLY 如何解决现实世界中的 SQL 数据操作挑战?

OUTER/CROSS APPLY 如何解决现实世界中的 SQL 数据操作挑战?

Barbara Streisand
Barbara Streisand原创
2025-01-10 06:06:41559浏览

How Can OUTER/CROSS APPLY Solve Real-World SQL Data Manipulation Challenges?

OUTER/CROSS APPLY 在 SQL 中的实际应用

OUTER 和 CROSS APPLY 是强大的 SQL 运算符,提供增强的数据操作功能。 本文通过实际示例阐明了它们的实际用途。

场景 1:每个类别前 N 条记录

OUTER 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>

场景 2:使用表值函数

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>

这可以有效地将 sys.dm_exec_query_plan 应用于 sys.dm_exec_query_stats 中的每一行。

场景 3:重用计算列

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>

场景 4:逆透视多个列组

对于违反 1NF 的数据集,APPLY 可以同时高效地逆透视多个列组:

<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>

掌握 OUTER/CROSS APPLY 可以显着增强 SQL 数据操作技能,为复杂的数据挑战提供高效的解决方案。

以上是OUTER/CROSS APPLY 如何解决现实世界中的 SQL 数据操作挑战?的详细内容。更多信息请关注PHP中文网其他相关文章!

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