あるテーブルから他のテーブルにデータをまとめてインサートする
レコードを他のテーブルにまとめてインサートする
このページでは、あるテーブルから他のテーブルにデータをまとめてインサートする方法を説明します。
例えば、次のような Students テーブルから MaleStudents テーブルに Gender = 'M' の Students の FirstName と LastName をインサートしたいとします。
StudentID INT NOT NULL PRIMARY KEY,
FirstName VARCHAR(50) NULL,
LastName VARCHAR(50) NULL,
BirthDay SMALLDATETIME NULL,
Gender CHAR(1) NULL
);
INSERT INTO Students
(StudentID, FirstName, LastName, BirthDay, Gender)
VALUES
(1, 'Taro', 'Yamada', '1980-02-15' ,'M'),
(2, 'Hanako', 'Tanaka' ,'1979-12-30', 'F'),
(3, 'Yuko', 'Suzuki', '1979-07-07', 'F'),
(4, 'Takao', 'Sato', '1980-03-12', 'M'),
(5, 'Hiroki', 'Takagi', '1979-04-05', 'M');
以下のクエリーを実行して、他のテーブルにインサートしたいデータを確認しておきます。
LastName
FROM Students
WHERE Gender = 'M';
この 3 人の名前を一度に MaleStudents テーブルにインサートしてみましょう。
あるテーブルから他のテーブルにデータをまとめてインサートするには 2 つの方法があります。
1. INSERT INTO ... SELECT を使ってデータをインサートする
ひとつめの方法は INSERT INTO ... SELECT を使う方法です。 この方法使うには、インサート先のテーブルは事前に存在していなければなりません。
まず、インサート先の MaleStudents1 テーブルを作ります。
FirstName VARCHAR(50) NULL,
LastName VARCHAR(50) NULL
);
インサート先のテーブルはローカル (#Table) ・グローバル (##Table) のテンポラリーテーブルや、テーブル変数 (@Table) でもかまいません。
INSERT INTO ... SELECT クエリーを実行します。
以下の INSERT INTO ... SELECT クエリーを実行して MaleStudents1 テーブルにデータをまとめてインサートします。
FirstName,
LastName
)
SELECT FirstName,
LastName
FROM Students
WHERE Gender = 'M';
以下のクエリーを実行して MaleStudents1 テーブルにデータがインサートされたか確認します。
FROM MaleStudents1;
データが MaleStudents1 テーブルに正しくインサートされていることが確認できました。
2. SELECT ... INTO [NewTableName] FROM を使ってデータをインサートする
ふたつめの方法は SELECT ... INTO [NewTableName] FROM を使う方法です。 この方法使う場合は、インサート先のテーブルは存在していてはいけません。
SELECT ... INTO [NewTableName] FROM を実行した時に SELECT 文で指定したカラムと同じデータ型のカラムを持つ新しいテーブルが作られます。
インサート先のテーブルにはローカル (#Table) ・グローバル(##Table) のテンポラリーテーブルを使用することができますが、テーブル変数 (@Table) は使えません。
SELECT ... INTO [NewTableName] FROM クエリーを実行します。
次の SELECT ... INTO [NewTableName] FROM クエリーを実行して MaleStudents2 テーブルにデータをインサートします。
LastName
INTO MaleStudents2
FROM Students
WHERE Gender = 'M';
以下のクエリーを実行して結果を確認します。
FROM MaleStudents2;
MaleStudents2 テーブルが作られ、データが正しくインサートされていることが確認できました。
どちらもカーソルを使用して 1 行 1 行インサートするよりもずっと効率が良いので、特別な処理が必要でない限りカーソルは使わず、INSERT INTO ... SELECT や SELECT ... INTO を使いましょう。
※このページで作ったテーブルを消したい場合は以下のクエリーを実行してください。
DROP TABLE MaleStudents1;
DROP TABLE MaleStudents2;