SQL Server 入門 SQL Server 入門

あるテーブルから他のテーブルにデータをまとめてインサートする

ホーム > 便利なT-SQL&クエリー集 > あるテーブルから他のテーブルにデータをまとめてインサートする

レコードを他のテーブルにまとめてインサートする

このページでは、あるテーブルから他のテーブルにデータをまとめてインサートする方法をご説明します。

例えば、次のような Students テーブルから MaleStudents テーブルに Gender = 'M' の Students の FirstName と LastName をインサートしたいとします。

CREATE TABLE Students (
   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');

以下のクエリーを実行して、他のテーブルにインサートしたいデータを確認しておきます。

SELECT FirstName,
       LastName
FROM   Students
WHERE  Gender = 'M';

インサートしたいデータの確認結果

この 3 人の名前を一度に MaleStudents テーブルにインサートしてみましょう。

あるテーブルから他のテーブルにデータをまとめてインサートするには 2 つの方法があります。

1. INSERT INTO ... SELECT を使ってデータをインサートする

ひとつめの方法は INSERT INTO ... SELECT を使う方法です。 この方法使うには、インサート先のテーブルは事前に存在していなければなりません。

まず、インサート先の MaleStudents1 テーブルを作ります。

CREATE TABLE MaleStudents1 (
   FirstName VARCHAR(50) NULL,
   LastName VARCHAR(50) NULL
);

インサート先のテーブルはローカル (#Table) ・グローバル (##Table) のテンポラリーテーブルや、テーブル変数 (@Table) でもかまいません。

INSERT INTO ... SELECT クエリーを実行します。

以下の INSERT INTO ... SELECT クエリーを実行して MaleStudents1 テーブルにデータをまとめてインサートします。

INSERT INTO MaleStudents1 (
         FirstName,
         LastName
  )
  SELECT FirstName,
         LastName
  FROM   Students
  WHERE  Gender = 'M';

以下のクエリーを実行して MaleStudents1 テーブルにデータがインサートされたか確認します。

SELECT *
FROM   MaleStudents1;

データが MaleStudents1 テーブルに正しくインサートされていることが確認できました。

INSERT INTO ... SELECT の結果

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 テーブルにデータをインサートします。

SELECT FirstName,
       LastName
INTO   MaleStudents2
FROM   Students
WHERE  Gender = 'M';

以下のクエリーを実行して結果を確認します。

SELECT *
FROM   MaleStudents2;

SELECT INTO の結果

MaleStudents2 テーブルが作られ、データが正しくインサートされていることが確認できました。

※このページで作ったテーブルを消したい場合は以下のクエリーを実行してください。

DROP TABLE Students;
DROP TABLE MaleStudents1;
DROP TABLE MaleStudents2;

どちらもカーソルを使用して 1 行 1 行インサートするよりもずっと効率が良いので、特別な処理が必要でない限りカーソルは使わず、INSERT INTO ... SELECT や SELECT ... INTO を使いましょう。

SQL Server 関連のおすすめ書籍
ホーム > 便利なT-SQL&クエリー集 > あるテーブルから他のテーブルにデータをまとめてインサートする