【问题标题】:how to compare 2 tables, remove old records and add new records sql如何比较2个表,删除旧记录并添加新记录sql
【发布时间】:2013-02-25 10:14:16
【问题描述】:

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

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

【问题讨论】:

  • 你使用什么风格的 SQL?
  • 我使用的是 sql server 2008

标签: sql database sql-server-2008 comparison


【解决方案1】:

看看在 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

【讨论】:

  • 有没有办法进行这种合并但使用所有列标题?只是我没有关键字段,因为我的记录适用于多种语言,因此 ID 可能会针对几种语言出现,这就是为什么我需要基于几列进行搜索。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果您的表有任何已定义的唯一键,您可能可以使用 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);
    

    【讨论】:

    • 我没有唯一的密钥,因为我的记录是针对所有不同语言的,因此对于几种语言可能会出现相同的 ID。当我尝试您的建议时,我得到:“当 EXISTS 未引入子查询时,选择列表中只能指定一个表达式。”
    猜你喜欢
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多