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
。
答案 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);