2017-07-26 45 views
0

我有兩個更新語句。他們都給出了相同的輸出。它們如何不同,哪個更好用?下面兩個更新語句在SQL中有何不同?

聲明1:

UPDATE li 
SET li.Description = im.Description 
FROM tbSupplierLineItem li 
JOIN tbIMPACArchieveNew im ON li.ItemId = im.CommomCode 
WHERE li.ProcessedDate >= CONVERT(DATE,GETDATE()) 

聲明2:

UPDATE li 
SET li.Description = im.Description 
FROM tbSupplierLineItem li 
JOIN tbIMPACArchieveNew im ON li.ItemId = im.CommomCode 
AND li.ProcessedDate >= CONVERT(DATE,GETDATE()) 
+0

沒有真正的區別。有些人更喜歡使用'where',因爲條件是在一張桌子上過濾。 –

+0

INNER JOIN(這是)沒有區別。 OUTER JOIN差異很大。 –

+0

這就像正在加入的數據集,如果您在JOIN子句中添加更多條件,就像「只有滿足條件的表的一部分正在加入」一樣,如果有的話,首先它會加入表中的所有數據,實現即「ItemId」標準,然後將其過濾出來以符合條件 – Veljko89

回答

2

通過內部連接,差異只是語義上的差異。這兩個查詢應該產生完全相同的查詢計劃和完全相同的結果。

但是,當您使用外部聯接時,如果條件位於on子句的where子句或on上,則它很重要。

UPDATE li 
SET li.Description = im.Description 
FROM tbSupplierLineItem li 
RIGHT JOIN tbIMPACArchieveNew im ON li.ItemId = im.CommomCode 
           AND li.ProcessedDate >= CONVERT(DATE,GETDATE()) 

UPDATE li 
SET li.Description = im.Description 
FROM tbSupplierLineItem li 
RIGHT JOIN tbIMPACArchieveNew im ON li.ItemId = im.CommomCode 
WHERE li.ProcessedDate >= CONVERT(DATE,GETDATE()) 

不僅在語義層次不同。
雖然第一個查詢將返回右連接的預期結果,但第二個查詢將事實上返回內連接的預期結果。
這是因爲如果左表上的記錄與它們不匹配,那麼右表值可能爲空,並且由於將任何值與null(包括另一個null)進行比較都會導致false,因此基本上會更改右加入到內部聯接。

1

是否有把一個過濾器謂語WHERE子句或ON子句中的差僅取決於JOIN你的類型正在做。對於內部連接,沒有區別。對於外連接,將謂詞放在ON子句中可能意味着您不必在WHERE子句中編寫OR xxx IS NULL也可以使用

示例。這兩個查詢相同的功能:

SELECT * 
FROM 
    a 
    LEFT OUTER JOIN 
    b 
    ON 
    a.id = b.id AND 
    b.type = 'circle' 

SELECT * 
FROM 
    a 
    LEFT OUTER JOIN 
    b 
    ON 
    a.id = b.id 
WHERE 
    b.type = 'circle' OR b.id IS NULL 

從第二省略查詢OR b IS NULL可能會導致某些行從結果中消失了,如果是在一個連續,不具有相應的行B中