繁体   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