Я пытаюсь выполнить базовое обновление на iSeries db2 с помощью оператора MERGE, как описано в Есть ли в DB2 оператор вставки или обновления? и http://db2performance.blogspot.com/2011/12/merge-make-your-upserts-quick.html. При выполнении он дает мне Row not found for MERGE. SQLSTATE=02000
вместо вставки строки. Поскольку у меня в операторе when not matched then insert
, почему он возвращает ошибку вместо вставки? Я осмотрел все ТАК и не увидел этой конкретной проблемы.
Вот утверждение, которое я использую:
merge into UFDFTRN as T using (
select * from UFDFTRN
where DFCNO = 354 and DFINV = 1179 and DFLC = 1 and DFDATE = '2017-01-31'
and DFSPLT = 0 and DFSEQ = 100
) as S on (
T.DFCNO = S.DFCNO and T.DFINV = S.DFINV and T.DFDATE = S.DFDATE and
T.DFSPLT = S.DFSPLT and T.DFSEQ = S.DFSEQ
) when matched then
update set DFSEQ = 1000, DFTRAN = 0, DFITEM = 'F224', DFRITM = '0',
DFDESC = 'DAIRY VTM PREMIX', DFQTY = 3, DFUM = '',DESIQU = 0, DFRTQU = 3,
DFUPR = 0, DFCTUP = 0, DFUCST = 0, DFOUCST = 0, DFAMT = 0, DFOAMT = 0, DFCODE = '',
DFURAT = '', DFCGCD = '0', DFCTNO = 0, DFADJITM = '', DFADJPCT = 0, DFMNFITM = '',
DFMNFRAT = '', DFMNFQTY = '0', DFMNFTQTY = '0'
when not matched then
insert (DFCNO, DFINV, DFLC, DFDATE, DFSPLT, DFSEQ, DFTRAN, DFITEM, DFRITM, DFDESC,
DFQTY, DFUM, DFSIQU, DFRTQU, DFUPR, DFCTUP, DFUCST, DFOUCST, DFAMT, DFOAMT, DFCODE,
DFURAT, DFCGCD, DFCTNO, DFADJITM, DFADJPCT, DFMNFITM, DFMNFRAT, DFMNFQTY, DFMNFTQTY
) values (
354, 1179, 1, '2017-01-31', 0, 1000, 0, 'F224', '0', 'DAIRY VTM PREMIX', 3, '', 0,
3, 0, 0, 0, 0, 0, 0, '', '', '0', 0, '', 0, '', '', '0', '0'
)
on duplicate key update
. Ссылки, которые я разместил, подразумевают, что upsert можно выполнить с помощью слияния. Есть ли другой / лучший способ? Я использую одну и ту же таблицу, потому что на самом деле я не объединяю две разные таблицы, а просто пытаюсь проверить, существует ли запись, и если да, обновить ее, а если нет, вставить ее. - person Kelly Keller-Heikkila   schedule 31.01.2017