oracle - 如何在 Oracle 中获取合并数据
问题描述
我有一个表 SALARY_MASTER ,其中包含empid
和salary
。下面是表结构。
EMPID SALARY
------- ------
10001 12000
10002 60000
10003 25000
10004 35000
10005 15000
10006 24000
10007 85000
10008 75000
10009 65000
10010 67000
10011 95000
10012 23000
10013 48000
10014 25000
10015 35000
另一个以SALARY_CURRENT
相同列命名的表。下面是样本数据。
EMPID SALARY
------- ------
10001 24000
10003 36000
10005 23000
10007 99000
10009 79000
10016 52000
10017 98000
10018 63000
10019 77000
10020 47000
10021 35000
此表包含员工的更新工资。在每个季度,我都从更高的权威那里得到这个表,我需要SALARY_MASTER
根据这个表更新这个SALARY_CURRENT
表。所以我merge
在这种情况下使用了命令。以下是我的merge
声明:
MERGE into SALARY_MASTER SM
USING
SALARY_CURRENT SC
ON
(SM.EMPID = SC.EMPID)
WHEN MATCHED THEN
UPDATE SET SM.SALARY = SC.SALARY
WHEN NOT MATCHED THEN
INSERT (SM.EMPID,SM.SALARY) VALUES(SC.EMPID,SC.SALARY);
合并 my 后SALARY_MASTER
,表格如下:
EMPID SALARY
------- ------
10001 24000
10002 60000
10003 36000
10004 35000
10005 23000
10006 24000
10007 99000
10008 75000
10009 79000
10010 67000
10011 95000
10012 23000
10013 48000
10014 25000
10015 35000
10016 52000
10017 98000
10018 63000
10019 77000
10020 47000
10021 35000
我只想要受影响的行。我的输出表如下所示:
EMPID SALARY STATUS
------- ------- ------
10001 24000 UPDATE
10002 60000 NONE
10003 36000 UPDATE
10004 35000 NONE
10005 23000 UPDATE
10006 24000 NONE
10007 99000 UPDATE
10008 75000 NONE
10009 79000 UPDATE
10010 67000 NONE
10011 95000 NONE
10012 23000 NONE
10013 48000 NONE
10014 25000 NONE
10015 35000 NONE
10016 52000 INSERT
10017 98000 INSERT
10018 63000 INSERT
10019 77000 INSERT
10020 47000 INSERT
10021 35000 INSERT
或者:
EMPID SALARY STATUS
------- ------- ------
10001 24000 UPDATE
10003 36000 UPDATE
10005 23000 UPDATE
10007 99000 UPDATE
10009 79000 UPDATE
10016 52000 INSERT
10017 98000 INSERT
10018 63000 INSERT
10019 77000 INSERT
10020 47000 INSERT
10021 35000 INSERT
我正在使用 Oracle 11g。实际表包含超过 300k 的值。
解决方案
将 EXIST/NOT EXISTS 与 UNION 一起使用将解决您的问题,请查看以下代码:
select sm.empid,sm.salary,'UPDATE' status
from salary_master sm
where exists (select 1 from salary_current sc where sc.empid = sm.empid)
union
select sc.empid,sc.salary,'INSERT' status
from salary_current sc
where not exists (select 1 from salary_master sm where sm.empid = sc.empid);
推荐阅读
- javascript - 从文件输出流下载 png 文件
- specman - Specman e:delay() 可以将变量作为时间单位的输入吗?
- reactjs - 构建项目后访问本地文件时出错?
- node.js - 移除的中间件仍在使用
- oop - 现代 Fortran getter/setter
- nhibernate - 如何在 NHibernate 5 中捕获查询执行?
- teradata - 在运行时在 mload 中动态传递输入文件
- c - 比较c linux fgets中的2个文件
- ios - 仅从第二次开始获取用户位置
- android - AsyncTask 导致重载问题(双项、错误数据等),但在 UI 上运行太慢