0

次のクエリを使用して、テーブルの列を更新しようとしています。その場合、32000行が更新されます。

Update Table72D012 t2 set DEFINING_ARGUMENT_ID = 
(
SELECT   t3.ID
FROM     Table70t3 t3,
         Table70t1 t1,
         Table70t0 t0,         
         Table4 t4
WHERE    t2.Model_id = t4.ID
AND      t3.ID = t1.PARAM_VALUE_BPVA_ID
AND      t3.VALUE_BPAR_ID = t0.ID
AND      t0.KEY='SPECIAL_KEY'
AND      t1.LANGUAGE='en'
AND      t4.Model = t1.name

);

結果を確認したかったので、次のクエリを使用して関連するIDの数を取得しました。結果26500を取得しました。結果(更新の数と選択した結果の数)が互いに異なるのはなぜですか?
UPDATEクエリを修正するにはどうすればよいですか?

選択のみ

SELECT   t3.ID
FROM     Table70t3 t3,
         Table70t1 t1,
         Table70t0 t0,
         Table72D012 t2,
         Table4 t4
WHERE    t2.Model_id = t4.ID
AND      t3.ID = t1.PARAM_VALUE_BPVA_ID
AND      t3.VALUE_BPAR_ID = t0.ID
AND      t0.KEY='SPECIAL_KEY'
AND      t1.LANGUAGE='en'
AND      t4.Model = t1.name
4

1 に答える 1

3

まず、正しい結合構文を学ぶ必要があります。WHERE句で結合を行うことは、悪い考えです。

理由は簡単です。WHERE句やその他の条件がないため、最初のクエリはテーブルの行を更新しています。

2番目のクエリは、クエリに一致するすべての行を返します。更新バージョンでは、これらの行はNULLの値を取得します。

これは優れた構文であり、MS SQLではサポートされていますが、DB2ではサポートされていません。

Update Table72D012 t2
    set DEFINING_ARGUMENT_ID = t3.ID
    from (SELECT t4.id as t4_id, t3.ID
          FROM Table70t3 t3 join 
               Table70t1 t1
               on t3.ID = t1.PARAM_VALUE_BPVA_ID join
               Table70t0 t0
               on t3.VALUE_BPAR_ID = t0.ID join
               Table4 t4 
               on t4.Model = t1.name
          WHERE t0.KEY='SPECIAL_KEY' AND t1.LANGUAGE='en'
          ) t
    WHERE t2.Model_id = t4_ID

DB2がUPDATEでFROM句を許可しているとは思わないので、次のようなものが必要です。

Update Table72D012 t2
    set DEFINING_ARGUMENT_ID = 
         (SELECT t3.ID
          FROM Table70t3 t3 join 
               Table70t1 t1
               on t3.ID = t1.PARAM_VALUE_BPVA_ID join
               Table70t0 t0
               on t3.VALUE_BPAR_ID = t0.ID join
               Table4 t4 
               on t4.Model = t1.name
          WHERE t0.KEY='SPECIAL_KEY' AND t1.LANGUAGE='en' and t2.Model_id = t4.ID
          ) 
    WHERE exists              
         (SELECT t3.ID
          FROM Table70t3 t3 join 
               Table70t1 t1
               on t3.ID = t1.PARAM_VALUE_BPVA_ID join
               Table70t0 t0
               on t3.VALUE_BPAR_ID = t0.ID join
               Table4 t4 
               on t4.Model = t1.name
          WHERE t0.KEY='SPECIAL_KEY' AND t1.LANGUAGE='en' and t2.Model_id = t4.ID
          ) 
于 2012-06-29T16:38:07.257 に答える