2012-01-23 13 views
5

を削除奇妙に思えるが、これは私が何をしたいです可能性がありますT-SQLは、私はタイトルを知って挿入されたレコード

  1. 私は多くのレコードを持つテーブルを持っています。
  2. このレコードの一部を取得し、別のテーブルに挿入したいと考えています。このような何か:

    INSERT INTO TableNew SELECT * FROM TableOld WHERE ...

  3. はトリッキーな部分は、私は私が削除されるように挿入し、この行は同様に元テーブルを形成したいということです。

だけ私がやるために管理していると思いますが、選択されたレコードを保存するための一時テーブルを使用するようにした後、第2のテーブルにそれらを置くために、その行を削除しているので、これを行う簡単な方法は、あります最初のテーブルからそれらと一致します。それは解決策ですが、非常に多くのレコードを持つ(3以上の何百万人と半分)私は他のいくつかのアイデアを探しています...

+0

バージョン? –

+1

OUTPUT句を使用してください... –

答えて

13

をこのようなOUTPUT句:

DELETE FROM TableOld 
OUTPUT DELETED.* INTO TableNew 
WHERE YourCondition 

あなたがを使用することができ、単一のトランザクションで実行し、完了または同時にバック

+0

これを復活できるかどうかわかりませんが、ソーステーブルと宛先テーブルにID列があるときにこれを行う方法がありますか? – intA

0

次のようないくつかのことを行う必要があります:2005+使用で

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

DELETE FROM "table1" 
WHERE ... 
+2

DELETEはどこですか? –

2

をロールされますコピーされた行のIDを一時テーブルに格納する句。次に、一時表に基づいて元の表から行を削除できます。 SQL Serverのの

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.

関連する問題