AS400 - 使用合并向表中添加新记录并防止重复密钥错误
问题描述:
我创建了一个新表VISNHDR,其中包含以下字段(它不是整个表,但对于我的问题来说这已足够):AS400 - 使用合并向表中添加新记录并防止重复密钥错误
- 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
);
我得到一个错误:
Row not found for MERGE.
什么是正确的语法来实现我的问题?
答
我找到了正确的语法:
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)
评论:
取决于你如何定义你的列,你可能会得到一个错误说:
one or more of the columns omited from the column list was created as not null.
这是我得到的错误,我需要将我在表中的其他字段添加到查询中。这与我在这篇文章中遇到的语法问题没有任何关系。
我没有为您更正的查询,但问题是您尝试使用v2表中的结果,但在该表中没有结果。基本上如你所写的那样,“搜索记录X.如果记录X不存在,则使用记录X的内容创建记录X.”我怀疑在你不匹配的值部分时,你需要最终传入的参数而不是V2.Field条目。 – Hellion
@Hellion,谢谢它帮助我理解这个问题 – ehh