【SQL】UPDATEで同じテーブルの値・別のテーブルの値で更新する方法


このページでは、ORACLEデータベースのSQLで、UPDATE文で列の値を、同じテーブルの値で更新する方法を紹介しています。

UPDATE文のサンプルは↓で多数紹介していますので参考にしてください。
>>【SQL】UPDATE文の書き方:サンプル多数あり

同じテーブルの値で更新する方法

UPDATE文で、同じテーブルの値を使うときには、別表としてUPDATE句で取得します。

次のSQLでは、更新するTAB1テーブルをaとし、別表としてTAB1テーブルをbとして指定しています。aとbはINNER JOINで結合しています。

UPDATE 
    tab1 a
    inner join tab1 b ON a.col1 = b.col1
SET 
    a.col2 = b.col3
;

条件が一致したレコードは、COL2の値がCOL3の値に更新されます。

同じテーブルの値をSELECTして更新する方法

同じテーブルの値をSELECTする方法もあります。

先ほどのSQLを改造して、別表として呼び出すTAB1テーブルをSELECTして副問合せ(サブクエリ)として記述することもできます。

次のSQLでは、「(SELECT col1,col3 FROM tab1 )」として、別表をサブクエリーとして呼び出して使用しています。

UPDATE 
    tab1 a
    inner join (SELECT col1,col3 FROM tab1 ) b on a.col1 = b.col1
SET 
    a.col2 = b.col3
where
    a.col1 = '00001'
;

別のテーブルの値で更新する方法

UPDATE文で別のテーブルの値を使って更新する場合には、JOINを使ってテーブルを結合する方法があります。

実際に、テーブルを2つ作って実行してみます。
どちらも同じレイアウトで、空のテーブルを2つ作ります。

更新するためのレコードも登録します。
それぞれのテーブルに主キー違いで、XXXXXの大文字と小文字、YYYYYの大文字と小文字を格納したレコードを格納しました。

insert into tab1 values('00001','XXXXX','xxxxx');
insert into tab1 values('00002','XXXXX','xxxxx');
insert into tab1 values('00003','XXXXX','xxxxx');

insert into tab2 values('00001','YYYYY','yyyyy');
insert into tab2 values('00002','YYYYY','yyyyy');
insert into tab2 values('00003','YYYYY','yyyyy');

UPDATE文です。

次のUPDATE文では、INNER JOINを使ってTAB1テーブルのレコードを更新しました。

COL2の値、COL3の値はそれぞれTAB2テーブルの値を取得して更新しました。

UPDATE 
    tab1 a
    inner join tab2 b on a.col1 = b.col1
SET 
    a.col2 = b.col2
    ,a.col3 = b.col3
where
    a.col1 = '00001'
;
更新した結果は次のようになりました。
1行目のレコードが、TAB2テーブルの列の値によって更新されました。