如何比较2个表,删除旧记录并添加新记录sql

如何比较2个表,删除旧记录并添加新记录sql

问题描述:

我有2个sql表格,格式完全相同,1个用作临时表,1个用作静态表。如何比较2个表,删除旧记录并添加新记录sql

目前我的代码只是擦除静态表并每次使用临时表中的新数据填充它,但这不完全是我所需要的。我试图创建一些类型的SQL比较比较这两个表,然后将删除不在临时表中但在静态表中的记录,它会添加新的记录在临时表中但不是静态表格。所以静态表只是每次更新而不是被擦除和重写。

所以,如果我的临时表有:ABC1,ABC2,ABC4 和我的静态表已:ABC1,ABC3,ABC4

我的SQL查询在理想情况下返回:ABC1,ABC2,ABC4

我有2查询似乎选择我想要删除的值和我想要添加的值,但我目前无法让删除一个正常工作,所以我想知道是否有什么我从查询中丢失。

这个查询插入那就是在临时表中的数据,而不是静态的表格:

Insert into [static table] 
    SELECT * 
    FROM [temp table] 

EXCEPT 

SELECT * 
    FROM [static table] 

该查询应删除的静态表中的数据而不是临时表:

delete from [static table] 
where not exists 
    (SELECT * 
    FROM [static table] 

EXCEPT 

SELECT * 
    FROM [temp table]) 

任何人都可以提出什么问题与我的查询,或者如果有更好的方式来执行此任务?谢谢

+0

你使用什么风格的SQL? – AdaTheDev 2013-02-25 10:15:34

+0

我正在使用sql server 2008 – RebeccaD 2013-02-25 10:20:03

看看MERGE这是在2008年SQL

例如引入未经检验的,但像...

MERGE StaticTable AS target 
USING TempTable AS source ON target.ColumnA = source.ColumnA 
-- value doesn't exist in the target table, so add it 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (ColumnA) VALUES (source.ColumnA) 
-- value doesn't exist in the source table, so delete from target 
WHEN NOT MATCHED BY SOURCE THEN 
    DELETE 

编辑:要在多列的工作,是这样的:

MERGE StaticTable AS target 
    USING TempTable AS source ON target.ColumnA = source.ColumnA 
     AND target.ColumnB = source.ColumnB 
    -- value doesn't exist in the target table, so add it 
    WHEN NOT MATCHED BY TARGET THEN 
     INSERT (ColumnA, ColumnB) VALUES (source.ColumnA, source.ColumnB) 
    -- value doesn't exist in the source table, so delete from target 
    WHEN NOT MATCHED BY SOURCE THEN 
     DELETE 
+0

有没有办法做到这一点,但使用所有列标题?只是我没有关键字段,因为我的记录适用于多种语言,因此ID可能会出现在几种语言中,这就是为什么我需要将搜索基于几列。 – RebeccaD 2013-02-25 10:42:48

+0

查看更新的回答 – AdaTheDev 2013-02-25 10:46:20

我想'合并'应该做你想做的。 下面是详细信息: http://msdn.microsoft.com/en-us/library/bb522522(v=sql.105).aspx

如果你的表有你可能可以使用任何语法定义的唯一键:

DELETE FROM static WHERE id NOT IN(SELECT id from temporary); 
INSERT INTO static WHERE id IN(SELECT id from temporary) AND NOT id IN (SELECT id from static); 
+0

我没有唯一的密钥,因为我的记录适用于所有不同的语言,因此可能会出现几种语言的相同ID。当我尝试你的建议时,我得到:“只有一个表达式可以在子查询不与EXISTS引入时在选择列表中指定。” – RebeccaD 2013-02-25 10:38:57