2017-10-18 119 views
2

我創建了一個新表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

回答

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) 

評論:

取決於你如何定義你的列,你可能會得到一個錯誤說:

one or more of the columns omited from the column list was created as not null.

這是我得到的錯誤,我需要將我在表中的其他字段添加到查詢中。這與我在這篇文章中遇到的語法問題沒有任何關係。