ORACLE SQL リファレンス(逆引き)

ORACLE SQL リファレンス

Web oracle.se-free.com
SELECTで取得した値でUPDATEする
スポンサード リンク

サンプル表「dept」データ
SQL> select * from dept;

DEP DEPT_NAME
--- ----------
D01 総務部
D02 経理部
D04 営業部
D05 管理部

サンプル表「emp99」データ
SQL> select * from emp99;

EMP DEP DEPT_NAME EMP_NAME  SALARY
--- --- ---------- ---------- ----------
E01 D01 *****     なまえ1    100
E02 D02 *****     なまえ2    200
E03 D03 *****     なまえ3    300
E04 D04 *****     なまえ4    400


例1) 表「emp99」の列「dept_name」を表「dept」の列「dept_name」の値で更新する
SQL> update
  2   emp99 ep
  3  set dept_name = (
  4   select dp.dept_name
  5   from dept dp
  6   where ep.dept_id = dp.dept_id);

4行が更新されました。

SQL> select * from emp99;

EMP DEP DEPT_NAME EMP_NAME  SALARY
--- --- ---------- ---------- ----------
E01 D01 総務部     なまえ1    100
E02 D02 経理部     なまえ2    200
E03 D03          なまえ3    300
E04 D04 営業部     なまえ4    400
 SELECTの結果が無いレコードは、NULLで更新される。(E03のレコード)


例2) 例1)の更新で、表「dept」に対象のレコードが存在しない場合は更新しないようにする
SQL> update
  2   emp99 ep
  3  set dept_name = (
  4   select dp.dept_name
  5   from dept dp
  6   where ep.dept_id = dp.dept_id)
  8  where
  9   exists( select 'X' from dept dd where ep.dept_id = dd.dept_id);

3行が更新されました。

SQL> select * from emp99;

EMP DEP  DEPT_NAME EMP_NAME  SALARY
--- ---  ---------- ---------- ----------
E01 D01  総務部     なまえ1    100
E02 D02  経理部     なまえ2    200
E03 D03  *****      なまえ3    300
E04 D04  営業部     なまえ4    400
 exists句を使用するこで、表「DEPT」に無いレコードは更新されずに「*****」のままとなる。


例3) SELECTした複数の項目でUPDATEするの場合の記述方法
 update
  emp ep
 set (dept_name, dept_etc) = (
  select dp.dept_name, dp.dept_etc
  from dept dp
  where ep.dept_id = dp.dept_id )


スポンサード リンク


SELECTの結果をINSERTする
SELECTの結果から条件により、INSERTするテーブルを振り分ける(INSERT〜WHEN)
SELECTで取得した値でUPDATEする
更新レコードのデータによって、UPDATEする内容を変更する
レコードが存在しなければINSERT、レコードが存在すればUPDATEする(MERGE)
SELECTで取得した値をキーにDELETEする
重複したレコードをDELETEする

SQL(DML2) へ
忘れっぽいエンジニアのオラクルSQLリファレンス TOPへ