我正在尝试在没有匹配项时插入记录或者在有匹配项时进行更新
这是我的 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 不返回任何匹配时,没有插入发生。 更新没问题。
根据您发布的数据,这是目标表内容:
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>
因此,我会说它按预期工作。还是我错过了重点?