AS400 - Использование слияния для добавления новой записи в таблицу и предотвращения ошибки дублированного ключа
Я создал новую таблицу VISNHDR со следующими полями (это не вся таблица, но этого достаточно для моего вопроса):
- ORDNO (VARCHAR 7) - KEY
- ORDDT (NUMERIC 7,0) - KEY
- ORDTM (NUMERIC 6,0) - KEY
- CRTDT (NUMERIC 7,0)
- CRTTM (NUMERIC 6,0)
я пытаюсь INSERT
новая запись в этой таблице, и я пытаюсь предотвратить ее вставку в случае duplicate key
, Я предпочитаю делать это в одном запросе вместо одного запроса, чтобы проверить, существует ли дублирование, и другого, чтобы вставить запись. Согласно моим исследованиям в сети, я пытался использовать MERGE
но безуспешно
MERGE INTO visnhdr v1 USING ( SELECT
ordno,
orddt,
ordtm
FROM
visnhdr
WHERE
ordno = 'M12345'
AND orddt = 1170101
AND ordtm = 101010
) AS V2(ordno,orddt,ordtm)
ON (
v1.ordno = v2.ordno
AND v1.orddt = v2.orddt
AND v1.ordtm = v2.ordtm
)
WHEN NOT MATCHED THEN INSERT (
ordno,
orddt,
ordtm,
crtdt,
crttm
) VALUES (
v2.ordno,
v2.orddt,
v2.ordtm,
1170102,
101011
);
Я получаю ошибку:
Строка не найдена для MERGE.
Какой правильный синтаксис для достижения моей проблемы?
1 ответ
Я нашел правильный синтаксис:
MERGE INTO VISNHDR V1 USING (
VALUES ('M12345', 1170101, 101011, 1170103, 101012)) V2 (ORDNO, ORDDT, ORDTM, CRDDT, CRTTM)
ON V1.ORDNO = V2.ORDNO AND V1.ORDDT = V2.ORDDT AND V1.ORDTM = V2.ORDTM
WHEN NOT MATCHED THEN
INSERT VALUES(V2.ORDNO, V2.ORDDT, V2.ORDTM, V2.CRDDT, V2.CRTTM)
Комментарий:
В зависимости от того, как вы определили свои столбцы, вы можете получить сообщение об ошибке:
один или несколько столбцов, пропущенных из списка столбцов, были созданы как ненулевые.
Это ошибка, которую я получил, и мне нужно было добавить другие поля из моей таблицы в запрос. И это не имеет ничего общего с синтаксической проблемой, с которой я столкнулся в этом посте.