【问题标题】:APPLY - is this exclusively used when joining to a functionAPPLY - 加入函数时是否专门使用
【发布时间】:2012-09-21 02:40:28
【问题描述】:

运营商APPLY 不是我有任何使用经验的运营商,我担心我会错过某些可能性。

This article by Alexander Kuznetsov gives a good example

在 Alexander 的示例中,他使用 APPLY 连接到函数的返回 - 在其他情况下,我应该首先使用 APPLYCROSSOUTER

【问题讨论】:

标签: sql sql-server


【解决方案1】:

APPLY 可以加入任意结果集。我发现通过一些排序返回 TOP 1 行特别有用:

select *
from T
cross apply (
 select top 1 * from T2 order by DateTime desc
) x

APPLY 可以做任何加入可以做的事情,甚至更多。但它不能使用连接提示。

基本上,如果一个连接就足够了,你就想使用一个连接。如果您需要更多,请使用 apply,因为它使用起来有点麻烦。

【讨论】:

    【解决方案2】:

    APPLY 是一个逐行运算符,它允许您将先前表的每一行APPLY 用于函数或子查询。因此,它在以下情况下非常有用

    1. 您需要 A 中每条记录中来自 B 的最新/最大/最小记录
    2. 您需要对 A 中的每条记录运行表值函数

    是的,它可以替代 JOIN,但它会在正常 JOIN 可以工作的地方表现得非常糟糕,因为您强制 SQL Server 使用逐行运算符而不是基于集合的 JOIN。

    CROSS APPLY 和 OUTER APPLY 的区别与 INNER JOIN 和 OUTER JOIN 的区别一样。基本上,如果应用它的函数/子查询返回 0 条记录,则 CROSS APPLY 将删除源记录。 OUTER APPLY 保留源记录。

    阅读更多:Using Apply (msdn)

    【讨论】:

      【解决方案3】:

      基本上连接用于组合两个结果集,但 CROSS APPLY 的行为类似于循环,它获取外部表结果,然后将每一行作为参数传递给驱动表或表值函数以生成结果集。 Apply CROSS APPLY 和 OUTER APPLY 有两种形式。 CROSS APPLY t 只返回与驱动表或表值函数匹配的行,OUTER APPLY 结果所有外部表记录和驱动表匹配尽量避免使用 apply,因为它的慢查询然后加入

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多