例: UPDATE ステートメントの相関副照会

UPDATE ステートメントの中で相関副照会を使用するときには、相関名は更新対象の行を表します。

例えば、あるプロジェクトのすべての活動が 1983 年 9 月の前に完了しなければならないときに、部門ではそのプロジェクトを優先プロジェクトと見なすとします。次に示す SQL ステートメントを使用すると、CORPDATA.PROJECT 表内のプロジェクトを評価し、各優先プロジェクトの PRIORITY 列 (この目的のために CORPDATA.PROJECT に追加した列) に 1 (PRIORITY を示すフラグ) を書き込むことができます。

まず、以下のように、表を変更して PRIORITY 列を追加します。

ALTER TABLE CORPDATA.PROJECT ADD COLUMN PRIORITY INT

次に、以下の照会を実行して更新を実行します。

  UPDATE CORPDATA.PROJECT X
    SET PRIORITY = 1
    WHERE '1983-09-01' >
       (SELECT MAX(EMENDATE)
           FROM CORPDATA.EMPPROJACT
           WHERE PROJNO = X.PROJNO)

SQL は、CORPDATA.EMPPROJACT 表の各行を調べるときに、プロジェクト (CORPDATA.PROJECT 表にある) のすべての活動について、最大の活動終了日 (EMENDATE) を判別します。プロジェクトに関連する各活動の終了日が 1983 年 9 月よりも前であれば、CORPDATA.PROJECT 表の現在行は優先プロジェクトに該当し、更新されます。

受注数量に変更があればそれに従ってマスター受注表を更新します。 受注表の数量が設定されていない場合 (NULL 値の場合) は、マスター受注表にある値のままにします。 これらの表は、CORPDATA サンプル・データベースに存在しません。

UPDATE MASTER_ORDERS X
   SET QTY=(SELECT COALESCE (Y.QTY, X.QTY)
              FROM ORDERS Y
              WHERE X.ORDER_NUM = Y.ORDER_NUM)
   WHERE X.ORDER_NUM IN (SELECT ORDER_NUM 
              FROM ORDERS)

この例では、MASTER_ORDERS 表の各行は、対応する ORDERS 表の行があるかどうか、検査されます。 ORDERS 表に一致する行があれば、COALESCE 関数が使用されて QTY 列の値が戻されます。 ORDERS 表の QTY が非ヌル値である場合は、その値が MASTER_ORDERS 表の QTY 列の更新に使用されます。 ORDERS 表の QTY が NULL である場合は、MASTER_ORDERS QTY 列自身が持っていた値が使用されて更新されます。