web-dev-qa-db-ja.com

DB2の単一の更新ステートメントで複数の列を更新する方法

DB2のテーブルの複数の列を単一のUpdateステートメントで更新したい。

どんなヒントやアイデアも認められます。ありがとう。

17
Superman

SQLのすべてのバージョンの更新ステートメントは次のようになります。

update table
    set col1 = expr1,
        col2 = expr2,
        . . .
        coln = exprn
    where some condition

そのため、答えはコンマを使用して割り当てを分離し、setステートメントを繰り返さないことです。

36
Gordon Linoff

値が別のテーブルから取得された場合、使用することができます

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

例:

UPDATE table1
SET (col1, col2, col3) =(
   (SELECT MIN (ship_charge), MAX (ship_charge) FROM orders), 
   '07/01/2007'
)
WHERE col4 = 1001;
6
update table_name set (col1,col2,col3) values(col1,col2,col);

標準のSQLではなく、動作していませんGordon Linoffが言ったようにこれを使用するようになりました:

update table
    set col1 = expr1,
        col2 = expr2,
        . . .
        coln = exprn
    where some condition
0
Dan

私はそれが古い質問であることを知っていますが、IDに基づいて複数のレコードを異なる値で更新する必要がある複数行の更新の解決策を見つける必要があり、スカラーサブセレクトを使用できることがわかりました:

UPDATE PROJECT
  SET DEPTNO =
        (SELECT WORKDEPT FROM EMPLOYEE
           WHERE PROJECT.RESPEMP = EMPLOYEE.EMPNO)
  WHERE RESPEMP='000030'

(もちろん、WHEREはオプションです)

また、この更新でNULL値を使用しないように指定することが重要であることがわかりました(最初のテーブルのすべてのレコードに2番目のテーブルの対応するレコードがあるわけではない場合)。

UPDATE PROJECT
  SET DEPTNO =
        (SELECT WORKDEPT FROM EMPLOYEE
           WHERE PROJECT.RESPEMP = EMPLOYEE.EMPNO)
  WHERE RESPEMP IN (SELECT EMPNO FROM EMPLOYEE)

ソース: https://www.ibm.com/support/knowledgecenter/ssw_i5_54/sqlp/rbafyupdatesub.htm

0
InitK

これは、MERGEコマンドが機能しない場合の「旧式のソリューション」です(バージョン10より前だと思います)。

UPDATE TARGET_TABLE T 
SET (T.VAL1, T.VAL2 ) =  
(SELECT S.VAL1, S.VAL2
 FROM SOURCE_TABLE S 
 WHERE T.KEY1 = S.KEY1 AND T.KEY2 = S.KEY2)
WHERE EXISTS 
(SELECT 1  
 FROM SOURCE_TABLE S 
 WHERE T.KEY1 = S.KEY1 AND T.KEY2 = S.KEY2 
   AND (T.VAL1 <> S.VAL1 OR T.VAL2 <> S.VAL2));
0
Hennie van Dyk