T-SQL Удалить вставленные записи - PullRequest
5 голосов
/ 23 января 2012

Я знаю, что название может показаться странным, но это то, что я хочу сделать:

  1. У меня есть таблица с большим количеством записей.
  2. Я хочу получить некоторые изэто записи и вставить их в другую таблицу.Примерно так:

    INSERT INTO TableNew SELECT * FROM TableOld WHERE ...

  3. Сложность в том, что я хочу, чтобы эти строки, которые я вставил, также были удалены из исходной таблицы.

Есть ли простой способ сделать это, потому что единственное, что мне удалось сделать, - это использовать временную таблицу для сохранения выбранных записей, а затем поместить их во вторую таблицу иудалить строки, которые соответствуют им из первой таблицы.Это решение, но с таким количеством записей (более 3 с половиной миллионов) я ищу какую-то другую идею ...

Ответы [ 3 ]

14 голосов
/ 23 января 2012

В 2005+ используйте условие OUTPUT, например:

DELETE FROM TableOld 
OUTPUT DELETED.* INTO TableNew
WHERE YourCondition

Это будет выполнено в одной транзакции и будет либо завершено, либо выполнено откат одновременно

2 голосов
/ 23 января 2012

Вы можете использовать предложение insert ... output для хранения идентификаторов скопированных строк во временной таблице. Затем вы можете удалить строки из исходной таблицы на основе временной таблицы.

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

Рабочий пример в проводнике данных.

0 голосов
/ 23 января 2012

Вы должны сделать что-то вроде этого:

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

DELETE FROM "table1"
WHERE ...
...