[英]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.