Oracle 12c - вставка с несколькими условиями - PullRequest
1 голос
/ 24 мая 2019

У меня 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_id не существует в employee_history

Более 2 миллионов записей.

Значение 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 ОБА имеют значение emp_salary, равное 0, тогда emp_ind будет равно N.

Для emp_type C emp_ind будет N

Я могу придумать сценарий для выполнения большей части этого, но я теряюсь в том, как кодировать операторы case из-за проверки значений для нескольких записей в таблице employee_salary. Надеюсь, кто-то может предоставить мне сценарий для этого.

1 Ответ

2 голосов
/ 24 мая 2019

Я думаю, это то, что вам нужно:

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'
...