web-dev-qa-db-ja.com

db2:複数の行とフィールドを別のテーブルの選択で更新する

a.x == B.zであるAのすべての行に対して、異なるテーブル(B.c B.d)の値cおよびdを使用して、テーブル(A.aおよびA.b)のフィールドaおよびbをインクリメントすることは可能ですか?

私はこのクエリに夢中になっています

9
Luka

DB2とSQL標準では、UPDATEステートメントにFROM句がありません。だからあなたはステップを明確に分ける必要があります

  1. 変更する行を特定します
  2. 新しい値を計算します。

次に例を示します。

UPDATE TABLE A
SET A.FLD_SUPV = ( SELECT B.FLD_SUPV
FROM TABLEA A, TABLEB B, TABLEC C,TABLED D
WHERE A.FLD1= B.FLD1
AND A.FLD_DT >= B.FLD_FM_DT
AND A.FLD_DT <= B.FLD_THRU_DT
AND A.FLD_DT > D.FLD_THRU_DT
AND A.FLD_DT < C.FLD_EFF_DT )
WHERE EXISTS ( SELECT B.FLD_SUPV
FROM TABLEA A, TABLEB B, TABLEC C,TABLED D
WHERE A.FLD1= B.FLD1
AND A.FLD_DT >= B.FLD_FM_DT
AND A.FLD_DT <= B.FLD_THRU_DT
AND A.FLD_DT > D.FLD_THRU_DT
AND A.FLD_DT < C.FLD_EFF_DT )

2つのフィールドを更新するには、次のような例を使用できます。

UPDATE table1 t1 
 SET (col1, col2) = (
  SELECT col3, col4 
  FROM  table2 t2 
  WHERE t1.col8=t2.col9
 )

オプティマイザは、SETとFROM句のサブクエリが同一であることを確認し、内部実行プランにそれらをマージする必要があります。

8
aF.

はい、可能です。あなたはこのようなことを試すことができます:

MERGE INTO A
USING (SELECT c, d, z from B) B
ON (A.x = B.z)
WHEN MATCHED THEN
UPDATE SET A.a = A.a + B.c, A.b = A.b + B.d;

MERGE here についての詳細を読むことができます。

5
jhnwsk

これもかなりうまくいきます

update TableA A set a = (select a from TableB B where A.x = B.z) where exists (select 1 from TableB B where A.x = B.z) ;

1

DB2 10.6でテスト済み

@jhnwskと実質的に同じですが、テーブルのショートカットが追加されています。

Merge into "PRODUCTION"."COUNTRY" as N
      using (SELECT OD.NAME,OD.KEY from "DEVELOPMENT"."COUNTRY" as OD) as O
      on (O.KEY = N.KEY)
      WHEN MATCHED THEN
           UPDATE SET N.NAME=O.NAME;
1
Tim Seed