仅当同一列中的值不同时才将 table 更新为 temp table

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

我想用临时 table 的联系数据更新 table。因为那里 有大量的行我必须更新 我只想更新与临时 table 中的列具有不同值的列。 (主要 table 应该只更新临时 table 中也存在的列的值) 两个 table 的列可以通过 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

对每一列都执行此操作不是很高效。那么,如果两列的值不同并且仅当列不同时才更新我的主 table 中的列,您是否知道检查更新语句的任何可能性?或者也许是一种将我对每一列的所有更新语句(如两者)合并到一个语句中的方法?

我正在使用 Microsoft SQL 服务器作为 RDBMS。以下是我的两个 table 的图表:

您可以只设置列:

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 服务器中效率会更高。

您可以将所有列组合成一个文本字符串,然后对它们执行 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)