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

我想我在这里疯了。我尝试更新Table1 的特定子集。假设来自Table1 的SELECT 返回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,这里的INNER 或LEFT JOIN 有什么问题?我想说你所有的 WHERE 1 =0 所做的只是返回一个 NULL ...
  • 微软不会对你的标题感到满意。 :P

标签: sql sql-server cross-apply


【解决方案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 列。谢谢,这帮助我恢复了理智:)
猜你喜欢
  • 1970-01-01
  • 2019-01-11
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多