SQL Server 入門 SQL Server 入門

ホーム > T-SQL でテーブルへデータの挿入・更新・削除 > INSERT と SELECT を使って他のテーブルからデータを挿入する

INSERT と SELECT を使って他のテーブルからデータを挿入する

INSERT と SELECT を使って他のテーブルからデータを挿入する

前回 「 T-SQL でテーブルにデータを挿入 (INSRET) する 」 では、 INSERT と VALUES を使ってテーブルにデータを挿入しました。

今回は INSERT と SELECT を使って、他のテーブルから取得した結果セットを、別のテーブルに挿入してみましょう。

これらのテーブルを使いますので、こちら のスクリプトを実行して、Student・Test・TestResult・TestResultSummary テーブルを再生成しておいてください。


INSERT & SELECT で他のテーブルからデータを挿入

[テーブル2] から SELECT で取得した結果セットを[テーブル1] に挿入するには、次のように書きます。

INSERT INTO [テーブル1] ( 
		[カラム1], 
		[カラム2],
		... 
	) 
	SELECT 	[カラム1], 
		[カラム2],
		... 
	FROM 	[テーブル2]
	WHERE 	...

カラムの数と、データタイプがマッチしていれば、カラム名は同じでなくても大丈夫です。

また、「 他のテーブルから 」 と書きましたが、SELECT 文で結果セットが [テーブル1] に INSERT したいカラムとマッチしさえすれば、 データの取得は同じテーブルからでも、結合したテーブルからでも、集計した結果でも大丈夫です。


次のような空っぽの TestResultSummary テーブルと、テストの結果が入った TestResult テーブルがあります。

INSERT と SELECT を使って他のテーブルからデータを挿入する 1

INSERT と SELECT を使って他のテーブルからデータを挿入する 2

INSERT と SELECT を使って他のテーブルからデータを挿入する 3


TestResult テーブルの値を集計して、TestResultSummary テーブルに値を挿入するクエリーは以下の通りです。

INSERT INTO TestResultSummary (
                TestID,
                MinScore,
                MaxScore,
                AvgScore
    )   
    SELECT      TestID,
                MIN(Score),
                MAX(Score),
                AVG(CAST(Score AS DECIMAL))
    FROM        TestResult
    WHERE       Score IS NOT NULL
    GROUP BY    TestID
    ORDER BY    TestID;

Score が NULL のレコードは集計の対象外としています。 また、AVG は小数点以下が欲しいので、DECIMAL にキャストしています。


[ 実行結果 ]
INSERT と SELECT を使って他のテーブルからデータを挿入する 4

TestResultSummary テーブルに、TestResult テーブルの集計結果が入りました。

「 CROSS JOIN (クロス結合)を使ってデータを取得する」 のおまけ でご紹介してたスクリプトも、こちらの INSERT & SELECT の方法でしたね!


次は、UPDATE と JOIN を使ってデータを更新してみましょう。

次へ UPDATE と JOIN を使ってデータを更新する

SQL Server 関連の人気書籍
ホーム > T-SQL でテーブルへデータの挿入・更新・削除 > INSERT と SELECT を使って他のテーブルからデータを挿入する