1

我有 2 个格式完全相同的 sql 表,1 个用作临时表,1 个用作静态表。

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

因此,如果我的临时表有: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] )

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

4

3 回答 3

2

看看SQL 2008 中引入的MERGE 。

例如未经测试,但类似...

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
于 2013-02-25T10:26:24.790 回答
1

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

于 2013-02-25T10:25:59.423 回答
0

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

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);
于 2013-02-25T10:30:51.867 回答