Обновить таблицу с помощью Left Join - PullRequest
1 голос
/ 08 марта 2012

Как мне обновить таблицу с левым соединением на скрипте. Я использую базу данных DB2.

Я создал оператор выбора, и он работает:

**

select  t1.estrcd as "transaction code",
        t1.espyno as "payer",
        t1.escuno as "customer no",
        t1.escino as "invoice no",
        t1.esvono as "voucher no",
        t1.escuam as "foreign currency amount",
        COALESCE(t2."received_amount",0) as "received amount",
        t1.escuam + COALESCE(t2."received_amount",0) as "outstanding amount"
from m3edbedu.fsledg t1 left join
        (select espyno, escino, sum(escuam) as "received_amount" from m3edbedu.fsledg
                where estrcd = 20 group by espyno, escino) as t2 on
        t2.espyno = t1.espyno and t2.escino = t1.escino
where t1.esreco = 0 and t1.estrcd = 10 and (t1.escuam + COALESCE(t2."received_amount",0)) = 0
order by t1.espyno, t1.escino, t1.estrcd;

**

но теперь они просят меня обновить таблицу и установить для t1.esreco значение 9. Я попытался использовать приведенный ниже скрипт для обновления, но получаю ошибку.

update m3edbedu.fsledg t1 LEFT JOIN(select espyno, escino, sum(escuam) as "received_amount"
           from m3edbedu.fsledg
           where estrcd = 20
           group by espyno, escino) as t2
           on t2.espyno = t1.espyno and t2.escino = t1.escino set t1.esreco = 9 where t1.esreco = 0 and t1.estrcd = 10 and (t1.escuam + COALESCE(t2."received_amount",0)) = 0 order by t1.espyno, t1.escino, t1.estrcd;1;

Ошибка: SQL0199 - Ключевое слово LEFT не ожидается. Действительные токены: SET. (Состояние: 37000, собственный код: FFFFFF39) Ошибка: SQL0104 - токен 1 не был действительный. Действительные токены: (CL END GET SET CALL DROP FREE HOLD LOCK OPEN OPEN С ALTER BEGIN. (Штат: 37000, собственный код: FFFFFF98)

Надеюсь, кто-нибудь может мне помочь.

Заранее спасибо. :)

Ответы [ 3 ]

1 голос
/ 08 марта 2012

Поскольку это база данных DB2, вы не можете указать предложение FROM в операторе обновления. Обновленный ответ отражает то, что вам нужно сделать (имейте в виду, что это никоим образом не оптимизировано).

update 
    m3edbedu.fsledg t1
set 
    t1.esreco = 9 
where
    t1.esreco = 0 and t1.estrcd = 10 and
    exists(select t2.espyno
        from m3edbedu.fsledg t2
        where t2.estrcd = 20 and t2.espyno = t1.espyno and t2.escino = t1.escino)
    and (t1.escuam + coalesce(
        (select sum(t2.escuam) 
        from m3edbedu.fsledg t2 
        where t2.estrcd = 20 and t2.espyno = t1.espyno and t2.escino = t1.escino), 0) = 0)
0 голосов
/ 09 марта 2012

DB2 не поддерживает объединения в операторе UPDATE, поэтому вам придется обойти эту проблему, например, сделать часть соединения коррелированным подзапросом, например:

UPDATE m3edbedu.fsledg update
SET esreco = 9
WHERE EXISTS (
    SELECT 1
    FROM m3edbedu.fsledg t1
    LEFT JOIN(
        SELECT espyno,
               escino,
               sum(escuam) as received_amount
          FROM m3edbedu.fsledg
         WHERE estrcd = 20
         GROUP BY espyno, escino
    ) as t2
    ON t2.espyno = t1.espyno
    AND t2.escino = t1.escino
    WHERE t1.unique_key1 = update.unique_key1
      AND t1.unique_key2 = update.unique_key2
      AND t1.unique_key3 = update.unique_key3
      --etc

      AND t1.esreco = 0
      AND t1.estrcd = 10
      AND (t1.escuam + COALESCE(t2.received_amount,0)) = 0
)

Вы, вероятно, хотите проверить и убедиться, что получаете правильные столбцы из подзапроса, изменив часть UPDATE на SELECT.

0 голосов
/ 08 марта 2012

Попробуйте вместо этого:

update t1 
SET t1.esreco = 9
from m3edbedu.fsledg t1 
LEFT JOIN ( select espyno, escino, sum(escuam) as "received_amount" 
            from m3edbedu.fsledg
            where estrcd = 20
            group by espyno, escino) as t2
on t2.espyno = t1.espyno 
and t2.escino = t1.escino 
where t1.esreco = 0 
and t1.estrcd = 10 
and (t1.escuam + COALESCE(t2."received_amount",0)) = 0 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...