記事内に広告が含まれています。

【SQL】他テーブルの値を使って更新(Update)するスクリプト

Update文において、あるテーブルの値を、別テーブルの値で更新する方法です。SQL Serverで実行していますが、Oracle・SQL Server・MySQL・PostgreSQLなど、主要なRBDMSでも使えます。

【スポンサーリンク】

別テーブルの値で更新するサンプル

取り敢えずサンプルのSQLです。

--1カラムのみ更新
UPDATE TABLE_A
   SET TABLE_A.TARGET_COL = (SELECT TAB_B.TARGET_COL
                               FROM TABLE_B TAB_B
                              WHERE TAB_B.KEY_COL = TABLE_A.KEY_COL)
 WHERE EXISTS (SELECT 1
                 FROM TABLE_B TAB_B
                WHERE TAB_B.KEY_COL = TABLE_A.KEY_COL);

--2カラム更新
UPDATE TABLE_A
   SET (TABLE_A.TARGET_COL_1
        TABLE_A.TARGET_COL_2
     = (SELECT TAB_B.TARGET_COL_P
              ,TAB_B.TARGET_COL_Q
          FROM TABLE_B TAB_B
         WHERE TAB_B.KEY_COL = TABLE_A.KEY_COL)
 WHERE EXISTS (SELECT 1
                 FROM TABLE_B TAB_B
                WHERE TAB_B.KEY_COL = TABLE_A.KEY_COL);

SET句にサブクエリを用いて、更新対象のテーブル(TABLE_A)のキーとサブクエリのキーを内部結合しているだけなので、とても簡単なものです。

複数カラムを更新したい場合は、SET句のカラムと、サブクエリのSELECT句のカラムの順番に注意して下さい。

WHERE句にEXISTSを使っているのは、更新対象のレコードを絞っています。EXISTSを使用しないと、全レコードを更新することになるので、実行時間が長くなります。

【スポンサーリンク】

実際に実行してみる

何はともあれ、実際に実行してみて確認しましょう。

サンプルデータを用意しておきます。

--テーブルCREATE文
CREATE TABLE [Flower](
	[FlowerCD][char](3) NOT NULL,
	[FlowerName][nvarchar](60) NOT NULL,
	[ColorCD][char](3) NOT NULL,
	[ColorName][nvarchar](20) NULL,
 CONSTRAINT [PK_Flower_FlowerCD] PRIMARY KEY([FlowerCD] ASC)
 );

--データINSERT文
INSERT INTO [Flower]([FlowerCD],[FlowerName],[ColorCD],[ColorName]) VALUES ('001',N'バラ','001',null);
INSERT INTO [Flower]([FlowerCD],[FlowerName],[ColorCD],[ColorName]) VALUES ('002',N'青バラ','002',null);
INSERT INTO [Flower]([FlowerCD],[FlowerName],[ColorCD],[ColorName]) VALUES ('003',N'タンポポ','003',null);
INSERT INTO [Flower]([FlowerCD],[FlowerName],[ColorCD],[ColorName]) VALUES ('004',N'サクラ','004',null);
INSERT INTO [Flower]([FlowerCD],[FlowerName],[ColorCD],[ColorName]) VALUES ('005',N'ラフレシア','999',null);

--テーブルCREATE文
CREATE TABLE [FlowerColor](
	[ColorCD][char](3) NOT NULL,
	[ColorName][nvarchar](20) NULL,
 CONSTRAINT [PK_Flower_ColorCD] PRIMARY KEY([ColorCD] ASC)
 );

--データINSERT文
INSERT INTO [FlowerColor]([ColorCD],[ColorName]) VALUES ('001',N'赤');
INSERT INTO [FlowerColor]([ColorCD],[ColorName]) VALUES ('002',N'青');
INSERT INTO [FlowerColor]([ColorCD],[ColorName]) VALUES ('003',N'黄');
INSERT INTO [FlowerColor]([ColorCD],[ColorName]) VALUES ('004',N'桃');

上記のSQLを実行してSELECTすると、データは以下の状態になっていると思います。

実行前確認

更新対象のテーブルは「Flower」、更新の元ネタになるテーブルは「FlowerColor」です。「Flower」テーブルの「ColorName」カラムがNULLなので、「FlowerColor」テーブルの「ColorName」の値で更新します。

この時、結合条件は、「Flower」テーブル.ColorCD と 「FlowerColor」テーブル.ColorCD です。

UPDATE [Flower]
   SET [Flower].ColorName = (SELECT TAB_COLOR.ColorName
                            FROM [FlowerColor] TAB_COLOR
                           WHERE TAB_COLOR.ColorCD = [Flower].ColorCD)
 WHERE EXISTS (SELECT 1
                 FROM [FlowerColor] TAB_COLOR
                WHERE TAB_COLOR.ColorCD = [Flower].ColorCD);

では実行してみます。

では、結果を見てみます。

実行後確認

「Flower」テーブルの「ColorName」の値がNULLでしたが、UPDATEを実行して、「FlowerColor」テーブルの「ColorName」に登録されている値で更新されていることが確認出来ました。

というわけで、ある特定のテーブルに対して、別テーブルの値で更新することが出来ました。