迭代行,检查更新,然后更新行

时间:2014-02-04 20:24:33

标签: sql-server tsql

我有一张表(比如数据库上的表A),它随着时间的推移而更新。我有另一个表(表B,从外部源创建),它也已更新,但通过不同的来源。

每个表都有一个ID, Name, RecordDetails, LastUpdatedDate

我如何做以下事情?

  • 迭代表B,并确定表A是否具有相同的ID。

    • 如果是,请比较LastUpdatedDate字段。

      • 如果B有更新的LastUpdatedDate,请使用B中的该记录的所有信息更新记录。

      • 否则,什么都不做。

  • 如果表A没有相同的ID,请将该记录从B添加到表A中。

1 个答案:

答案 0 :(得分:1)

不要考虑循环或迭代。 SQL Server(以及所有实际的RDBMS)都经过优化,可以在集合上工作。不要考虑你想对每一行做什么;想想你想对 设置 行做什么。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;

UPDATE A
  SET col1 = B.col1,
      col2 = B.col2, 
      etc.
 FROM dbo.TableA AS A
 INNER JOIN dbo.TableB AS B
 ON A.ID = B.ID
 WHERE A.LastUpdatedDate <= B.LastUpdatedDate;

INSERT dbo.TableA(ID, col1, col2, etc.)
 SELECT ID, col1, col2, etc.
  FROM dbo.TableB AS B
  WHERE NOT EXISTS
  (
    SELECT 1 FROM dbo.TableA
      WHERE ID = B.ID
  );

COMMIT TRANSACTION;

其他人可能会建议MERGE,但I highly recommend against it