Oracle merge INTO ,不做插入

问题描述 投票:0回答:1

我正在尝试在没有匹配项时插入记录或者在有匹配项时进行更新

这是我的 SQL 查询

merge INTO employee_identity tgt USING (
  select 
    e.employee_id, 
    eid.emp_cus_value, 
    eid.emp_doj 
  from 
    employee e 
    join employee_channel ec on e.employee_id = ec.employee_id 
    left join employee_identity eid on e.employee_id = eid.employee_id 
  where 
    ec.employee_channel_id = 53
) src ON (
  tgt.employee_id = src.employee_id
) WHEN NOT matched THEN INSERT (
  tgt.employee_identity_id, tgt.employee_id, 
  tgt.emp_cus_value, tgt.emp_doj
) 
VALUES 
  (3, 1121, 404, CURRENT_TIMESTAMP)
 WHEN matched THEN UPDATE 
SET 
  tgt.emp_cus_value = tgt.emp_cus_value + 10;
  

我面临的问题是,当 select 不返回任何匹配时,没有插入发生。 更新没问题。

http://sqlfiddle.com/#!4/d9d6fb/5

sql oracle sql-update sql-insert
1个回答
1
投票

根据您发布的数据,这是目标表内容:

SQL> select * from employee_identity;

EMPLOYEE_IDENTITY_ID EMPLOYEE_ID EMP_CUS_VALUE EMP_DOJ
-------------------- ----------- ------------- ----------
                   1        1121           404 07.04.2023
                   2        1122           604 07.04.2023  --> this is the match

第二行匹配

USING
子查询返回的数据:

SQL>   select
  2      e.employee_id,
  3      eid.emp_cus_value,
  4      eid.emp_doj
  5    from
  6      employee e
  7      join employee_channel ec on e.employee_id = ec.employee_id
  8      left join employee_identity eid on e.employee_id = eid.employee_id
  9    where
 10      ec.employee_channel_id = 51;

EMPLOYEE_ID EMP_CUS_VALUE EMP_DOJ
----------- ------------- ----------
       1122           604 07.04.2023

SQL>

因此,没有什么可以

INSERT
.


但是,如果从目标表中删除匹配行:

SQL> delete from employee_identity where employee_identity_id = 2;

1 row deleted.

SQL> select * from employee_identity;

EMPLOYEE_IDENTITY_ID EMPLOYEE_ID EMP_CUS_VALUE EMP_DOJ
-------------------- ----------- ------------- ----------
                   1        1121           404 07.04.2023

SQL>

然后运行

merge

SQL> merge INTO employee_identity tgt USING (
  2    select
  3      e.employee_id,
  4      eid.emp_cus_value,
  5      eid.emp_doj
  6    from
  7      employee e
  8      join employee_channel ec on e.employee_id = ec.employee_id
  9      left join employee_identity eid on e.employee_id = eid.employee_id
 10    where
 11      ec.employee_channel_id = 51
 12  ) src ON (
 13    tgt.employee_id = src.employee_id
 14  ) WHEN NOT matched THEN INSERT (
 15    tgt.employee_identity_id, tgt.employee_id,
 16    tgt.emp_cus_value, tgt.emp_doj
 17  )
 18  VALUES
 19    (3, 1121, 404, CURRENT_TIMESTAMP)
 20   WHEN matched THEN UPDATE
 21  SET
 22    tgt.emp_cus_value = tgt.emp_cus_value + 10;

1 row merged.

SQL>

并检查结果,这是您的 missing 行,它是 inserted during

merge
:

SQL> select * from employee_identity;

EMPLOYEE_IDENTITY_ID EMPLOYEE_ID EMP_CUS_VALUE EMP_DOJ
-------------------- ----------- ------------- ----------
                   1        1121           404 07.04.2023
                   3        1121           404 07.04.2023   --> here it is

SQL>

因此,我会说它按预期工作。还是我错过了重点?

© www.soinside.com 2019 - 2024. All rights reserved.