2017-04-26 58 views
2

我想我在这里失去了我的想法。我尝试更新Table1的特定子集。假设SELECTTable1返回100万行。对于这些行中的每一行,我想交叉应用Table2的特定计算总和。SQL - 交叉应用不能正常工作

我知道Table1中的所有行都不能与Table2一起加入CROSS APPLY部分中的条件。

更新仍然表示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 

有谁知道为什么会发生这种情况?

+1

我不知道为什么你使用'这个CROSS APPLY',这有什么错的'INNER'或'LEFT JOIN “这里?我会说你所有的'WHERE 1 = 0'都会返回NULL ... – Shaneis

+0

微软对你的头衔不会感觉不错。 :P – Sankar

回答

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)

+1

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