【问题标题】:Insert or update if already exists如果已存在则插入或更新
【发布时间】:2017-06-28 11:57:08
【问题描述】:
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(115)

Table 的插入查询是

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)

如果employee_id=111 已经存在,它应该更新else 它应该插入。 如果有人知道,请提供帮助

【问题讨论】:

  • 这里的业务逻辑是什么?这没有意义。
  • 如果员工 111 的奖金记录不存在,您将为员工 115 添加奖金记录吗?奇怪的。如果这是正确的,那么您在公司中有一个有趣的奖金制度..
  • 这只是一个示例,如果此合并查询有效,我将实施其他工作。请帮助我在技术上不要在这里寻找业务逻辑..
  • 如果您不提供我们可以理解和推理的要求,我们很难为您提供帮助。我已经修复了您的语法错误并向您展示了如何使用 MERGE。那你还想知道什么?

标签: oracle sql-merge


【解决方案1】:

类似:

MERGE INTO bonuses dst
USING ( SELECT '111' AS employee_id, '555' AS bonus FROM DUAL ) src
ON ( dst.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 );

【讨论】:

  • 合并查询如果employee_id不存在则插入数据的奖金表,否则更新现有奖金..
【解决方案2】:

您的语句有两个语法错误。

  • 您重复了insert 关键字。
  • 您错过了on 子句条件周围的括号。这些是强制性的,与普通 from 子句中的连接条件不同。

所以你的代码应该是这样的:

merge into bonuses b
using( select * from bonuses) s 
ON (s.employee_id = 115)  
WHEN MATCHED THEN update set bonus='555' 
WHEN NOT MATCHED THEN insert(employee_id) values(115)
/

但是,将目标表放在using 子句中是没有意义的。它不会产生你认为它会产生的结果......

SQL> select * from bonuses;

EMPLOYEE_ID      BONUS
----------- ----------
        111
        112
        113
        114
        115

5 rows selected.

SQL> merge into bonuses b
  2  using( select * from bonuses) s 
  3  ON (s.employee_id = 115)
  4  WHEN MATCHED THEN update set bonus='555' 
  5  WHEN NOT MATCHED THEN insert (employee_id) values(115)
  6  /  

9 rows merged.

SQL> select * from bonuses;

EMPLOYEE_ID      BONUS
----------- ----------
        111        555
        112        555
        113        555
        114        555
        115        555
        115
        115
        115
        115

9 rows selected.

SQL> 

也许这样的东西适合你?

merge into bonuses b
using( select * from employees) e 
    ON ( b.employee_id = e.employee_id ) 
WHEN MATCHED THEN 
    update set bonus= 555 
WHEN NOT MATCHED THEN 
    insert (employee_id) values (e.id)

如果您没有与 BONUSES 表不同的员工 ID 来源,您可以使用 DUAL 表来伪造它:

SQL> merge into bonuses b
  2  using( select 115 as employee_id, 555 as bonus from dual union all
  3         select 116 as employee_id, 555 as bonus from dual) e 
  4      ON ( b.employee_id = e.employee_id ) 
  5  WHEN MATCHED THEN 
  6      update set bonus= e.bonus 
  7  WHEN NOT MATCHED THEN 
  8      insert (employee_id) values (e.employee_id) 
  9  /

2 rows merged.

SQL> select * from bonuses;

EMPLOYEE_ID      BONUS
----------- ----------
        111
        112
        113
        114
        115        555
        116

6 rows selected.

SQL> 

【讨论】:

  • 合并查询如果employee_id不存在则插入数据的奖金表,否则更新现有奖金..任何例子都会有帮助,数据无关紧要
【解决方案3】:

我认为你所追求的是:

merge into bonuses tgt
using (select '111' employee_id, '555' bonus from dual) src
  on (tgt.employee_id = src.employee_id)
WHEN MATCHED THEN
  update set tgt.bonus = src.bonus 
WHEN NOT MATCHED THEN
  insert (tgt.employee_id, tgt.bonus)
  values (src.employee_id, src.bonus);

顺便说一句,为什么要将字符串插入通常具有某种形式的 NUMBER 数据类型的列中?这些列是否真的有字符串数据类型(例如 VARCHAR2、CHAR 等)?

【讨论】:

  • 合并查询如果employee_id不存在则插入数据的奖金表,否则更新现有奖金..任何例子都会有帮助,数据无关紧要
  • 这就是我提供给你的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 2021-02-04
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多