みなさんは既存のテーブルのレコードで、あるカラムを変更して、そのテーブルに追加したいということはありますでしょうか?
例えば。。。
Testテーブル「()は、データ型 」
Year (INT) | TestName (VARCHAR(30)) | SchoolYear(INT) | PassingScore(INT) |
2020 | 現代文 | 1 | 60 |
2020 | 数学A | 2 | 60 |
2020 | 日本史B | 3 | 80 |
2021 | 化学基礎 | 1 | 65 |
このようなテーブルがあったとして、以下のように2020年のレコードをコピーし、2024年に変更して追加したいと考えます。
Year(INT) | TestName(VARCHAR(30)) | SchoolYear(INT) | PassingScore(INT) |
2020 | 現代文 | 1 | 60 |
2020 | 数学A | 2 | 60 |
2020 | 日本史B | 3 | 80 |
2021 | 化学基礎 | 1 | 65 |
2024 | 現代文 | 1 | 60 |
2024 | 数学A | 2 | 60 |
2024 | 日本史B | 3 | 80 |
この場合、一から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