【SQLServer】一部のカラム値を変更したレコードをテーブルに追加する方法

みなさんは既存のテーブルのレコードで、あるカラムを変更して、そのテーブルに追加したいということはありますでしょうか?

例えば。。。

Testテーブル「()は、データ型 」

Year (INT)TestName (VARCHAR(30))SchoolYear(INT)PassingScore(INT)
2020現代文160
2020数学A260
2020日本史B380
2021化学基礎165

このようなテーブルがあったとして、以下のように2020年のレコードをコピーし、2024年に変更して追加したいと考えます。

Year(INT)TestName(VARCHAR(30))SchoolYear(INT)PassingScore(INT)
2020現代文160
2020数学A260
2020日本史B380
2021化学基礎165
2024現代文160
2024数学A260
2024日本史B380

この場合、一からINSERT文でずらずら実行するのは、ばかばかしいと感じたので何かいい方法がないか調査しましたので、共有いたします。

本記事では、SQLServerを対象としています。他のRDBでは異なる可能性があります。

概要

ご紹介する方法として

対象のレコード(変更したいレコード)を取得し、一時的に作成したテーブルに保存します。

一時的に作成したテーブルで値を変更し、元のテーブルに追加する流れになります。

では、実際にどのように行うか見ていきます。

①SELECT INTO ステートメント

対象のレコードを取得し、一時的に作成したテーブルに保存するにはSELECT INTOステートメントを用います。

以下のようにtemp_tableという一時テーブルを作成し、Testテーブルで2020年度のレコードを追加しています。

SELECT *
INTO temp_table
FROM Test
WHERE Year = 2020
go

②UPDATEステートメント

temp_tableを2024年度へ変更します。

UPDATE temp_table
SET Year = 2024
go

③INSERT INTO SELECTステートメント

temp_tableのレコードをTestテーブルに追加するためにINSERT INTO SELECTステートメントを用います。

INSERT INTO Test
SELECT * FROM temp_table
go

以上でTestテーブルに2020年のテストデータをコピーし2024年にして追加することができました。

最後に不要になったtemp_tableを削除しましょう。

drop table temp_table
go