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」に登録されている値で更新されていることが確認出来ました。
というわけで、ある特定のテーブルに対して、別テーブルの値で更新することが出来ました。