我有一张表(比如数据库上的表A),它随着时间的推移而更新。我有另一个表(表B,从外部源创建),它也已更新,但通过不同的来源。
每个表都有一个ID, Name, RecordDetails, LastUpdatedDate
。
我如何做以下事情?
迭代表B,并确定表A是否具有相同的ID。
如果是,请比较LastUpdatedDate字段。
如果B有更新的LastUpdatedDate,请使用B中的该记录的所有信息更新记录。
否则,什么都不做。
如果表A没有相同的ID,请将该记录从B添加到表A中。
答案 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。