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

Sql 如果已存在,则更新行,否则插入,sql,oracle11g,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

这将创建表查询

要插入的数据:

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)
它应该修改奖金的值,其中
员工id=111


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

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

改为使用伪单源记录。(而
MERGE
中的
ON
子句需要parantises。)

不过,令人惊讶的是,您没有在插入中设置奖金。(检查一个员工ID,如果没有,则插入另一个,这也是一种罕见的情况。)

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

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);

insert
?“我在执行此操作时出错。[但我不告诉你是哪一个,所以我将此作为一个难题留给你,从而更难帮助我]。是的,我出错了,这就是我来寻求帮助的原因。但哪个错误?你一定收到了一条错误消息,告诉你这个错误是关于什么的。请给我合并查询或任何其他方式来插入或更新如果退出,我不能使用选择计数如果已经存在,因为在我的真实场景过程中有很多这样的查询,不可能选择计数。我不明白。您需要一个
MERGE
语句。我已经纠正了你的错误。这与计数有什么关系?我没有计算已经存在的行的匹配项并进行插入或更新,而是进行了合并。好的。我已经更正了你的
MERGE
语句。对你有用吗?如果没有,这对你怎么不起作用?我这里面临一些网络问题,所以我现在无法检查,我很快会更新。谢谢你的帮助。。
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);
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);