Sql 如何比较两个表、删除旧记录和添加新记录

Sql 如何比较两个表、删除旧记录和添加新记录,sql,database,sql-server-2008,comparison,Sql,Database,Sql Server 2008,Comparison,我有两个格式完全相同的sql表,一个用作临时表,一个用作静态表 目前,我的代码只是擦除静态表,每次都用临时表中的新数据填充它,但这并不是我所需要的。我试图创建某种类型的sql diff来比较这两个表,然后删除不在临时表中但在静态表中的记录,并添加临时表中但不在静态表中的新记录。因此,静态表只在每次运行时更新,而不是擦除和重新写入 所以如果我的临时表有:ABC1,ABC2,ABC4 我的静态表有:ABC1,ABC3,ABC4 我的sql查询最好返回:ABC1、ABC2、ABC4 我有两个查询,似乎

我有两个格式完全相同的sql表,一个用作临时表,一个用作静态表

目前,我的代码只是擦除静态表,每次都用临时表中的新数据填充它,但这并不是我所需要的。我试图创建某种类型的sql diff来比较这两个表,然后删除不在临时表中但在静态表中的记录,并添加临时表中但不在静态表中的新记录。因此,静态表只在每次运行时更新,而不是擦除和重新写入

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

我的sql查询最好返回:ABC1、ABC2、ABC4

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

此查询插入临时表中的数据,但不插入静态表中的数据:

 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] )

有人能建议我的查询有什么问题,或者是否有更好的方法来执行此任务吗?谢谢

我想“合并”应该是你想要的。 详情如下:

看看SQL 2008中引入了哪些

e、 g.未经测试,但有点像

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);

您使用的是什么风格的SQL?我使用的是SQL server 2008。我没有唯一的密钥,因为我的记录适用于所有不同的语言,因此在一些语言中可能会出现相同的ID。当我尝试您的建议时,我得到了:“当子查询没有引入EXISTS时,只能在select列表中指定一个表达式。”是否有一种方法可以进行此合并,但使用所有列标题?只是我没有一个键字段,因为我的记录适用于几种语言,所以ID可能会出现在几种语言中,这就是为什么我需要基于几个列进行搜索的原因。