T-SQL の挿入されたレコードの削除
-
12-11-2019 - |
質問
タイトルが奇妙に思えるかもしれませんが、これが私がやりたいことです:
- 多くのレコードを含むテーブルがあります。
このレコードの一部を取得して、他のテーブルに挿入したいと考えています。このようなもの:
INSERT INTO TableNew SELECT * FROM TableOld WHERE ...
難しいのは、挿入したこの行を元のテーブルからも削除したいことです。
これを行う簡単な方法はありますか。選択したレコードを保存するために一時テーブルを使用し、それらを2番目のテーブルに配置し、最初のテーブルからそれらに一致する行を削除することしか考えられないからです。 。これは解決策ですが、非常に多くのレコード (300 万件以上) があるため、他のアイデアを探しています...
解決
2005 年以降に使用 OUTPUT
このような条項:
DELETE FROM TableOld
OUTPUT DELETED.* INTO TableNew
WHERE YourCondition
単一トランザクションで実行され、同時に完了またはロールバックされます。
他のヒント
使用できます 入れる ...出力 句を使用して、コピーされた行の 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
次のようなことを行う必要があります。
INSERT INTO "table1" ("column1", "column2", ...)
SELECT "column3", "column4", ...
FROM "table2"
WHERE ...
DELETE FROM "table1"
WHERE ...
所属していません StackOverflow