比较行并更新不同的值,如果不存在则更新

时间:2018-03-08 18:52:07

标签: c# sql-server tsql sql-server-2016

我有一个TABLE1和TABLE2具有相同的列(大约15个),除了TABLE2有其他日期字段。我试图遍历TABLE1(大约25,000)行,如果行不存在则插入TABLE2。 这可以没有任何问题地完成,但我想仅在任何列值与TABLE1不同时才更新TABLE2。我是否必须手动比较每个列值并更新?我找不到更简单的方法来做到这一点。我想这样做的原因是因为我想在有任何更新或插入时只在历史表中插入一行。

begin
   update table set ...
   where key = @key
end
else
begin
   insert into table (key, ...)
   values (@key, ...)
end

3 个答案:

答案 0 :(得分:1)

您需要一次完成列 如果你有一些空值,你需要检查那个

insert into history 
select t1.id, t1.col1, t2.col1  
from table2 t2 
join table1 t1 
  on t2.id = t1.id  
 and t1.col1 <> t2.col 

update t2 
set t2.col1 = t1.col1 
from table2 t2 
join table1 t1 
  on t2.id = t1.id 
 and t1.col1 <> t2.col

您也可以使用ouput子句进行更新

对于插入使用not exists

答案 1 :(得分:1)

+1用于推荐MERGE,因为这是一个可以在单个语句中处理两个实例的正确方法。如果您不熟悉它,可以运行两个单独的语句(UPDATE / INSERT)。

更新

如果您想根据您加入的任何键基于任何不相等的列进行更新,这非常简单。您可以从任一表中获取所有列的列表(最简单的方法是右键单击表和SELECT TOP 1000)。

突出显示列并按Shift + Tab并使用CTRL + F删除所有逗号,全部替换。将其复制并粘贴到Excel的A列中。

在B栏中插入以下公式:

B1:="T1."&A1&" <> T2."&A1&","

B2:="OR T1."&A2&" = T2."&A2&","

将公式一直复制并粘贴到列表中。所以:

UPDATE T1
SET T1.Column1 = T2.Column1
    ,T1.Column2 = T2.Column2
    ,T1.Column3 = T2.Column3
    ,T1.Column4 = T2.Column4
FROM Table1 T1
INNER JOIN Table2 T2
    ON T1.Table1PrimaryKey = T2.Table2PrimaryKey
WHERE T1.Column1 <> T2.Column1
    OR T1.Column2 <> T2.Column2
    OR T1.Column3 <> T2.Column3
    OR T1.Column4 <> T2.Column4

注意:由于正在更新所有列,如果任何列组合不匹配,那么您就可以了,因为更新匹配的列不会对任何内容产生任何影响。而且,如果您要跟踪日期更改时实施缓慢变化的维度,则更新日期仍然有效,因为至少一个列记录不匹配并因此更新。

INSERTING

INSERT INTO Table1 (Column1, Column2, Column3, Column4)
SELECT T2.Column1
    ,T2.Column2
    ,T2.Column3
    ,T2.Column4
FROM Table2 T2
WHERE T2.Table2PrimaryKey NOT EXISTS (SELECT T1.Table1PrimaryKey FROM Table1 T1)
ORDER BY T2.Table2PrimaryKey

注意:上面的INSERT假定您的PrimaryKey列是IDENTITY列,由于它是自动计算的,因此无法插入。如果您使用的主键不是IDENTITY字段,则需要将其包含在INSERT子句中。此外,ORDER BY将按照PRIMARY KEY的顺序插入记录。当PRIMARY KEY是IDENTITY字段时,这很有用,因为计算出的值至少是它来自的位置。如果所有INSERTS都使用此方法并且目标表仅从接收表接收记录并且既没有RESEEDS也没有删除,则IDENTITY主键列值将相同。

答案 2 :(得分:0)

假设您需要多次执行此操作,我建议您在表A上使用插入和更新触发器,以使表B保持最新。