SQL - CROSS APPLY 无法正常工作
Posted
技术标签:
【中文标题】SQL - CROSS APPLY 无法正常工作【英文标题】:SQL - CROSS APPLY not working properly 【发布时间】: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
【参考方案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