[英]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。 以下是我的兩個表的圖表:
您可以只設置列:
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.