簡體   English   中英

僅當相同列中的值不同時才使用臨時表更新表

[英]Update table with temp table only when values are different in the same columns

我想用臨時表的數據更新帶有聯系人數據的表。 因為有大量的行我必須更新,所以我只想更新與臨時表中的列具有不同值的列。 (在主表中應該只更新臨時表中也存在的列的值)兩個表的列可以用一個 personID 相互分配。

我試圖像這樣單獨更新每一列:

UPDATE tblContact 
SET tblContact.Lastname = t.Lastname
FROM tblContact c
INNER JOIN #TestTable t
ON c.PersNbr = t.PersNbr
WHERE c.Lastname != t.Lastname

對每一列執行此操作的性能並不高。 那么,如果兩列的值不同,並且僅當列不同時才更新主表中的列,您是否知道有可能檢查更新語句? 或者也許是一種將我對每一列的所有更新語句(例如兩者都合並到一個語句中)合並的方法?

我使用 Microsoft SQL Server 作為 RDBMS。 以下是我的兩個表的圖表:

臨時表

tblContacts(主表)

您可以只設置列:

UPDATE c 
    SET c.Lastname = t.Lastname,
        c.Firstname = t.Firstname,
        . . . 
FROM tblContact c INNER JOIN
     #TestTable t
     ON c.PersNbr = t.PersNbr
WHERE c.Lastname <> t.Lastname OR
      c.Firstname <> t.Firstname OR
      . . .;

如果您預計至少有一列發生變化,那么您實際上並不需要WHERE子句。 但是,如果您避免在沒有值更改的情況下進行不必要的更新,則在 SQL Server 中效率會更高。

您可以將所有列組合成一個文本字符串,然后對它們執行 MD5 散列以同時檢測所有列之間的任何差異。 這否定了非常慢的 OR 邏輯的使用。 這對於 On Prem 數據庫來說比基於雲的部署要好得多,但它既快速又簡單。

UPDATE C SET 
    C.FirstName = T.FirstName,
    C.LastName = T.Lastname
FROM tblContact C
JOIN #TestTable T
    ON T.PersNbr = C.PersNbr
WHERE 
    HASHBYTES('MD5',C.FirstName + C.LastName + C.Title) 
    != HASHBYTES('MD5',T.FirstName + T.LastName + T.Title)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM