如果已存在则更新一行,否则插入

时间:2017-06-29 05:22:28

标签: sql oracle11g

CREATE TABLE bonuses (employee_id NUMBER, bonus NUMBER DEFAULT 100);

此创建表查询。

要插入的数据:

INSERT INTO bonuses (employee_id) VALUES(111)
INSERT INTO bonuses (employee_id) VALUES(112)
INSERT INTO bonuses (employee_id) VALUES(113)
INSERT INTO bonuses (employee_id) VALUES(114)
INSERT INTO bonuses (employee_id) VALUES(115)

尝试使用合并查询进行插入或更新

merge into bonuses 
using( SELECT * FROM bonuses)s ON s.employee_id = 111   
WHEN MATCHED THEN update set bonus='555' 
WHEN NOT MATCHED THEN insert insert into BONUSES (employee_id) values(116)

它应该修改employee_id=111

的奖金值

执行此操作时出错。 这只是示例表,我创建了测试merge exec

1 个答案:

答案 0 :(得分:0)

这看起来非常错误。 USING子句应该指定更新/插入的源。所以你主要是说"我想用我的奖金表"中的数据更新我的奖金。因此,对于表中的每条记录,您都要检查是否插入或更新。

改为使用虚拟单源记录。 (并且ON中的MERGE子句需要parantheses。)

MERGE INTO bonuses 
USING (SELECT * FROM dual) s ON (bonuses.employee_id = 111)
WHEN MATCHED THEN UPDATE SET bonus = '555' 
WHEN NOT MATCHED THEN INSERT (employee_id) VALUES (116);

但令人惊讶的是,你没有在插页中设置奖金。 (并且它也是一种罕见的情况,可以检查一个员工ID,如果不存在,则插入另一个。)

这是一个更典型的查询,但这只影响员工ID 111:

MERGE INTO bonuses 
USING (SELECT 111 as employee_id, 555 as bonus FROM dual) src 
   ON (bonuses.employee_id = src.employee_id)
WHEN MATCHED THEN UPDATE SET bonus = src.bonus
WHEN NOT MATCHED THEN INSERT (employee_id, bonus) VALUES (src.employee_id, src.bonus);