【问题标题】:T-SQL Delete Inserted RecordsT-SQL 删除插入的记录
【发布时间】:2012-01-23 07:48:16
【问题描述】:

我知道标题可能看起来很奇怪,但这是我想做的:

  1. 我的表格有很多记录。
  2. 我想获取其中的一些记录并将它们插入到其他表中。像这样的:

    INSERT INTO TableNew SELECT * FROM TableOld WHERE ...

  3. 棘手的部分是我希望我插入的这些行也从源表中删除。

有没有一种简单的方法可以做到这一点,因为我唯一想到的就是使用临时表来保存选定的记录,然后将它们放在第二个表中并从中删除与它们匹配的行第一张桌子。这是一个解决方案,但有这么多记录(超过 300 万条半),我正在寻找其他想法......

【问题讨论】:

  • 使用 OUTPUT 子句...

标签: tsql select output sql-insert sql-delete


【解决方案1】:

在 2005 年以上使用 OUTPUT 子句,如下所示:

DELETE FROM TableOld 
OUTPUT DELETED.* INTO TableNew
WHERE YourCondition

它将在单个事务中执行,并同时完成或回滚

【讨论】:

  • 不知道我是否可以复活这个,但是当你在源表和目标表中有一个标识列时有没有办法做到这一点?
【解决方案2】:

您可以使用insert ... output 子句将复制行的ID 存储在临时表中。然后可以根据临时表从原表中删除行。

declare @Table1 table (id int, name varchar(50))
declare @Table2 table (id int, name varchar(50))

insert @Table1 (id,name)
          select 1, 'Mitt'
union all select 2, 'Newt'
union all select 3, 'Rick'
union all select 4, 'Ron'


declare @copied table (id int)

insert  @Table2
        (id, name)
output  inserted.id 
into    @copied
select  id
,       name
from    @Table1
where   name <> 'Mitt'

delete  @Table1
where   id in 
        (
        select  id 
        from    @copied
        )
        
select  *
from    @Table1

Working example at Data Explorer.

【讨论】:

    【解决方案3】:

    你应该这样做:

    INSERT INTO "table1" ("column1", "column2", ...)
    SELECT "column3", "column4", ...
    FROM "table2" 
    WHERE ...
    
    DELETE FROM "table1"
    WHERE ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-05
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多