Oracle 12c-插入具有多种条件的情况

时间:2019-05-24 00:14:18

标签: sql oracle insert sql-insert oracle12c

我有3张桌子。

employee (emp_id, emp_active, emp_type, emp_status)
employee_salary (emp_id, emp_code, emp_salary)
employee_history (emp_id, emp_ind)

我需要将满足以下所有条件的所有employee_history插入employee.emp_id

employee.emp_active = 'Y'

employee.emp_idemployee_history中不存在

有超过200万条记录。

将使用以下规则设置emp_ind的值:

对于emp_type A和B:

  • 如果emp_status是A或B,则emp_ind将是Y。
  • 如果emp_status为C,而employee_salary.emp_code C或D的emp_salary值都大于0,则emp_ind将为Y。
  • 如果emp_status为D或E,则emp_ind将为N。
  • 如果emp_status为F,employee_salary.emp_code C和D BOTH的emp_salary值为0,则emp_ind将为N。

对于emp_type C,emp_ind将为N

我可以拿出一个脚本来完成大部分工作,但是由于检查了employee_salary表中多个记录上的值,我对如何编写case语句一无所知。希望有人可以为此提供脚本。

1 个答案:

答案 0 :(得分:2)

我认为这是您所需要的:

insert into employee_history (emp_id, emp_ind)
select
  e.emp_id,
  case when e.emp_status in ('A', 'B') then 'Y'
       when e.emp_status = 'C' and exists (
         select 1 from employee_salary s 
         where s.emp_id = e.emp_id
           and (s.emp_code = 'C' or s.emp_code = 'D' and s.emp_salary > 0)
       ) then 'Y'
       when e.emp_status in ('D', 'E') then 'N'
       when e.emp_status = 'F' and exists (
         select 1 from employee_salary s 
         where s.emp_id = e.emp_id and s.emp_code = 'C' s.emp_salary > 0
       ) and exists (
         select 1 from employee_salary s 
         where s.emp_id = e.emp_id and s.emp_code = 'D' s.emp_salary > 0
       ) then 'N'
  end
from employee e
where e.emp_active = 'Y'