SQL - CROSS APPLY 无法正常工作

Posted

技术标签:

【中文标题】SQL - CROSS APPLY 无法正常工作【英文标题】:SQL - CROSS APPLY not working properly 【发布时间】:2017-04-26 14:10:31 【问题描述】:

我想我在这里疯了。我尝试更新Table1 的特定子集。假设来自Table1SELECT 返回100 万行。对于这些行中的每一行,我想交叉应用来自Table2 的特定计算总和。

我知道并非Table1 中的所有行都可以使用CROSS APPLY 部分中的条件连接到Table2

更新仍然显示 1,000,000 行受到影响。在此之后,我开始怀疑并将“1 = 0”条件添加到CROSS APPLY,因此它永远不会返回一行。

但它仍然会更新Table1 中的所有行?

UPDATE T1
SET T1.Field1 = T2.SumField
FROM
    (
        SELECT *
        FROM Table1
        WHERE ....
    ) T1
CROSS APPLY
    (
        SELECT SUM(Field1) SumField
        FROM Table2
        WHERE [A lot of Fields] = [Some Values from T1]
        AND 1 = 0 -- !!!
    ) T2

有人知道为什么会这样吗?

【问题讨论】:

我不知道你为什么要使用CROSS APPLY,这里的INNERLEFT JOIN 有什么问题?我想说你所有的 WHERE 1 =0 所做的只是返回一个 NULL ... 微软不会对你的标题感到满意。 :P 【参考方案1】:

第二个查询不是空集 - 它返回一个与结果连接的值 NULL。

UPDATE T1
SET T1.Field1 = T2.SumField
FROM
       (
        SELECT *
        FROM Table1
        WHERE ....
    ) T1
CROSS APPLY
    (
        SELECT Field1 SumField
        FROM Table2
        WHERE [A lot of Fields] = [Some Values from T1]
        AND 1 = 0 -- !!!
    ) T2

您将受到 0 行的影响(注意缺少 SUM)

【讨论】:

是的,你是对的。如果我使用 SUM 聚合,它将返回一个 NULL 列。谢谢,这帮助我恢复了理智:)

以上是关于SQL - CROSS APPLY 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

SQL 关于apply的两种形式cross apply 和 outer apply

SQL 关于apply的两种形式cross apply 和 outer apply

sql MS SQL Cross和Outer Apply Sample

SQL Server outer apply 和 cross apply

Hive 上的 CROSS APPLY SQL Server 查询

如何处理 CROSS APPLY [SQL Server] 中的空行