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.

什么是正确的语法来实现我的问题?

+1

我没有为您更正的查询,但问题是您尝试使用v2表中的结果,但在该表中没有结果。基本上如你所写的那样,“搜索记录X.如果记录X不存在,则使用记录X的内容创建记录X.”我怀疑在你不匹配的值部分时,你需要最终传入的参数而不是V2.Field条目。 – Hellion

+0

@Hellion,谢谢它帮助我理解这个问题 – ehh

我找到了正确的语法:

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.

这是我得到的错误,我需要将我在表中的其他字段添加到查询中。这与我在这篇文章中遇到的语法问题没有任何关系。