首页 > 解决方案 > 如何在 Oracle 中获取合并数据

问题描述

我有一个表 SALARY_MASTER ,其中包含empidsalary。下面是表结构。

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 的值。

标签: oracleoracle11goracle11gr2oracle11gr1

解决方案


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

推荐阅读