5

タイトルが奇妙に思えるかもしれませんが、これが私がやりたいことです。

  1. 多くのレコードを持つテーブルがあります。
  2. このレコードの一部を取得して、他のテーブルに挿入したいと考えています。このようなもの:

    INSERT INTO TableNew SELECT * FROM TableOld WHERE ...

  3. トリッキーな部分は、挿入したこの行を元のテーブルからも削除したいということです。

これを行う簡単な方法はありますか?私がなんとかしたと思うのは、選択したレコードを保存するために一時テーブルを使用し、次にそれらを2番目のテーブルに配置し、それらと一致する行を最初のテーブルから削除することだけです。 . それは解決策ですが、非常に多くのレコード(300万5000以上)があるため、他のアイデアを探しています...

4

3 に答える 3

14

OUTPUT2005 年以降は、次のような句を使用します。

DELETE FROM TableOld 
OUTPUT DELETED.* INTO TableNew
WHERE YourCondition

単一のトランザクションで実行され、同時に完了するかロールバックされます

于 2012-01-23T07:51:42.317 に答える
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

データエクスプローラーでの実例。

于 2012-01-23T07:58:53.057 に答える
0

次のようなことを行う必要があります。

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

DELETE FROM "table1"
WHERE ...
于 2012-01-23T07:51:25.810 に答える