簡體   English   中英

Oracle MERGE:僅觸發NOT MATCHED

[英]Oracle MERGE: only NOT MATCHED is triggered

數據庫: Oracle

表:

CREATE TABLE TABLE_FOR_TESTS (
    d DATE,
    t NUMBER(8)
)

合並:

MERGE INTO TABLE_FOR_TESTS
    USING DUAL
    ON ((SELECT COUNT(*) FROM TABLE_FOR_TESTS) = 1)
    WHEN MATCHED THEN
        UPDATE SET T = T+1
    WHEN NOT MATCHED THEN         
        INSERT (D, T) VALUES (sysdate, 1)

要么

    ...
    ON ((SELECT T FROM TABLE_FOR_TESTS) is not null)
    ...

我將參考MERGE的第一個版本,但是第二個版本具有相同的效果。

1)我第一次運行MERGE

  • 結果: 預期的 (因為沒有元素,所以ON條件為false => INSERT

2)我在這里運行:

SELECT COUNT(*) FROM TABLE_FOR_TESTS

它的輸出為“ 1”。

3)我第二次運行該合並

  • 結果: 意外INSERT ),預期:UPDATE(僅在sqlfiddle上有效)

為什么在第N次運行(N> 1)時ON條件為假? (如果在輸出2時為“ 1”)

(只是測試:如果我在第二次運行之前將條件更改為ON (1=1) ,則效果很好:UPDATE已完成)

我認為您誤解了合並的目的。

我希望您的桌子像這樣:

CREATE TABLE TABLE_FOR_TESTS (
    d DATE,
    t NUMBER(8),
    CONSTRAINT TABLE_FOR_TESTS_PK PRIMARY KEY (d)
)

然后合並語句可能是:

MERGE INTO TABLE_FOR_TESTS t
  USING (SELECT trunc(sysdate) d FROM DUAL) s
    ON (s.d = t.d)
  WHEN MATCHED THEN
    UPDATE SET t = t+1
  WHEN NOT MATCHED THEN         
    INSERT (d, t) VALUES (trunc(sysdate), 1)

連接在表的主鍵上的位置,並根據該PK值的記錄是否存在而更新或插入。

每天最多有一個記錄,並且t將保存每天該語句的執行次數(假設TABLE_FOR_TESTS上沒有其他DML)。

注意:sysdate本身包含一個時間組件。 trunc(sysdate)會將其刪除並將時間設置為00:00:00。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM