db2:使用不同表上的select更新多个行和字段

Luk*_*uka 8 sql db2

是否有可能使用不同表(Bc Bd)的值c和d为A的所有行增加表(Aa和Ab)的字段a和b,其中Ax == Bz?

我对此查询感到疯狂

aF.*_*aF. 8

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 )
Run Code Online (Sandbox Code Playgroud)

要更新两个字段,您可以使用如下示例:

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

优化器将看到SET和FROM子句中的子查询是相同的,它应该将它们合并到内部执行计划中.


jhn*_*wsk 5

对的,这是可能的.你可以尝试这样的事情:

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;
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关MERGE的更多信息.