[英]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
2)我在這里運行:
SELECT COUNT(*) FROM TABLE_FOR_TESTS
它的輸出為“ 1”。
3)我第二次運行該合並
為什么在第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.