如何比较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])
任何人都可以提出什么问题与我的查询,或者如果有更好的方式来执行此任务?谢谢
看看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
如果你的表有你可能可以使用任何语法定义的唯一键:
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);
我没有唯一的密钥,因为我的记录适用于所有不同的语言,因此可能会出现几种语言的相同ID。当我尝试你的建议时,我得到:“只有一个表达式可以在子查询不与EXISTS引入时在选择列表中指定。” – RebeccaD 2013-02-25 10:38:57
你使用什么风格的SQL? – AdaTheDev 2013-02-25 10:15:34
我正在使用sql server 2008 – RebeccaD 2013-02-25 10:20:03