2012-01-23 2 views
5

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

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

    INSERT INTO TableNew SELECT * FROM TableOld WHERE ...

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

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

+0

Версия Sql Server? –

+1

используйте предложение OUTPUT ... –

ответ

13

В 2005+ использования OUTPUT пункт так:

DELETE FROM TableOld 
OUTPUT DELETED.* INTO TableNew 
WHERE YourCondition 

это будет осуществляться в рамках одной транзакции и завершена или откат одновременно

+0

Не знаю, могу ли я воскресить это, но есть ли способ сделать это, когда у вас есть столбец идентификации в исходной и целевой таблицах? – intA

0

Вы должны сделать некоторые вещи, как это:

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

DELETE FROM "table1" 
WHERE ... 
+2

WHELE DELETE? –

2

Вы можете использовать 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 

Working example at Data Explorer.

Смежные вопросы