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)

Комментарий:

В зависимости от того, как вы определили свои столбцы, вы можете получить сообщение об ошибке:

один или несколько столбцов, пропущенных из списка столбцов, были созданы как ненулевые.

Это ошибка, которую я получил, и мне нужно было добавить другие поля из моей таблицы в запрос. И это не имеет ничего общего с синтаксической проблемой, с которой я столкнулся в этом посте.

Другие вопросы по тегам