db2: обновить несколько строк и полей с помощью выбора для другой таблицы - PullRequest
7 голосов
/ 12 декабря 2011

можно ли увеличить поля a и b таблицы (A.a и A.b), используя значения c и d другой таблицы (B.c B.d) для всей строки A, где A.x == B.z?

Я схожу с ума от этого запроса

Ответы [ 4 ]

8 голосов
/ 12 декабря 2011

DB2 и стандарт SQL не содержат предложение FROM в выражении UPDATE.Таким образом, вы должны четко разделить шаги, чтобы

  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 )

Для обновления двух полей вы можете использовать такой пример:

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

Оптимизатор увидит, что подзапросы в SETи предложение FROM идентично, и оно должно объединить их во внутреннем плане выполнения.

5 голосов
/ 28 сентября 2015

Да, это возможно.Вы можете попробовать что-то вроде этого:

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 вы можете прочитать здесь .

0 голосов
/ 17 июля 2017

Протестировано под 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;
0 голосов
/ 12 июня 2017
UPDATE CS70P t1 
 SET (T1.TIPOCRE) = (
  SELECT MOROSO
  FROM  FCSALDOC t2 ,CS70P t1
  WHERE t1.NUMCRE =t2.CODCTA
 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...