DB2のテーブルの複数の列を単一のUpdateステートメントで更新したい。
どんなヒントやアイデアも認められます。ありがとう。
SQLのすべてのバージョンの更新ステートメントは次のようになります。
update table
set col1 = expr1,
col2 = expr2,
. . .
coln = exprn
where some condition
そのため、答えはコンマを使用して割り当てを分離し、set
ステートメントを繰り返さないことです。
値が別のテーブルから取得された場合、使用することができます
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;
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
私はそれが古い質問であることを知っていますが、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
これは、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));