2017-04-26 60 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