2016-03-28 97 views
0

我的意圖是避免試圖將相同的記錄插入到數據庫中。 此聲明不插入記錄。 select中引用的記錄尚不存在,因此應該插入。任何想法,我錯了。Oracle,合併陳述不起作用

MERGE INTO XX0101.CAMPAIGN b 
    USING (SELECT * FROM XX0101.CAMPAIGN WHERE CAMPAIGN_ID=7 AND X_ID='0123' AND Y_ID='4567') a 
    ON (a.CAMPAIGN_ID = b.CAMPAIGN_ID) 
WHEN NOT MATCHED THEN 
    INSERT (CAMPAIGN_ID, X_ID, Y_ID, ROW_LAST_UPDATE_TS, ROW_LAST_UPDATE_ID) 
    VALUES (7, '0123', '4567', SYSDATE, 'ABC'); 
+0

呃..你是從表中查詢一條記錄,然後讓Oracle在同一個表中找到它(當然這找到了它)..所以既然匹配了,它就不會INSERT ..你爲什麼會認爲它會插入它? – Ditto

+0

我對MERGE的理解是select首先在表上執行,如果記錄不存在,那麼它將繼續插入。但是,我可能會誤會,因爲我剛剛遇到該功能,可能誤解了該功能。 – jimmy

+0

你是「排序」正確的。第一個Oracle檢索'USING'子句中的所有行。然後它將結果集「a」加入到您的初始表「b」中...使用「ON」子句進行連接。如果匹配或不匹配,你正在檢查。因爲你在「a」中設置的結果是空的(因爲'CAMPAIGN_ID = 7'不存在),所以MERGE沒有任何東西;;)我假設你有一個主鍵或唯一約束?如果是這樣,爲什麼不只是'INSERT'讓Oracle通過'DUP_VAL_ON_INDEX'告訴你它存在? – Ditto

回答

0

這聽起來並不像MERGE一份工作,而是一個簡單的INSERT

BEGIN 
    INSERT INTO XX0101.CAMPAIGN 
      (CAMPAIGN_ID, X_ID, Y_ID, ROW_LAST_UPDATE_TS, ROW_LAST_UPDATE_ID) 
     VALUES (7, '0123', '4567', SYSDATE, 'ABC'); 
    EXCEPTION 
    WHEN DUP_VAL_ON_INDEX THEN 
     NULL; 
    END; 
/

這裏假設你有一個PK或唯一索引。

+0

我有一個PK,所以我會使用這種方法。 – jimmy