ЕСЛИ условие для ВСТАВИТЬ И ОБНОВИТЬ в SQL - PullRequest
0 голосов
/ 18 марта 2020

У меня есть таблица EMPLOYEE, и я создал новую таблицу EMPLOYEE_SALARY_CHANGE (для отслеживания изменений в зарплате сотрудника)

вот таблица EMPLOYEE

ID | Employee_Salary | Active
1        500 -> 700       1
2          600            1
3         2100            1

500-> 700 означает, что employee_salary изменен от 500 до 700.

Вот таблица EMPLOYEE_SALARY_CHANGE

ID | Employee_Salary | Active
1          500            0
1          700            1
2          600            1
3         2100            1

, когда зарплата сотрудника изменяется с 500 на 700, мне нужно вставить новую строку в EMPLOYEE_SALARY_CHANGE

и обновите существующую активную до 0.

IF (EMPLOYEE.EMPLOYEE_SALARY != EMPLOYEE_SALARY_CHANGE.EMPLOYEE_SALARY, 
INSERT EMPLOYEE_SALARY_CHANGE INTO (EMPLOYEE.ID,EMPLOYEE.EMPLOYEE_SALARY,1) UNION 
UPDATE EMPLOYEE_SALARY_CHANGE SET ACTIVE = 0 WHERE EMPLOYEE.EMPLOYEE_SALARY = EMPLOYEE_SALARY_CHANGE.EMPLOYEE_SALARY))

, но что-то не так. Как вы думаете, лучше использовать php или можно обрабатывать в sql?

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Один метод использует union all:

select id, substring_index(employee_salary, ' -> ', 1) + 0 as employee_salary,
       (employee_salary not like '% -> %') as active
from t
union all
select id, substring_index(employee_salary, ' -> ', -1) + 0, 1
from t
where employee_salary like '% -> %';
0 голосов
/ 18 марта 2020

Обычно вы бы использовали триггер для обработки upsert. Например,

drop table if exists employee,employee_salary_change;
create table employee
(ID  int, Employee_Salary int, Active int);
insert into employee values
(1      ,    500   ,     1),
(2      ,    600   ,     1),
(3      ,    2100  ,     1);

create table EMPLOYEE_SALARY_CHANGE(
ID int, Employee_Salary int, Active int);
insert into employee_salary_change values
(1   ,       500   ,         1),
(2   ,       600   ,         1),
(3   ,      2100   ,         1);

drop trigger if exists t;
delimiter $$
create trigger t after update on employee
for each row 
begin
    update employee_salary_change
        set active = 0 where id = new.id;
    insert into employee_salary_change values (new.id,new.employee_salary,new.active);
end $$

delimiter ;
update employee 
    set employee_salary = 700 where id = 1;
select * from employee;
+------+-----------------+--------+
| ID   | Employee_Salary | Active |
+------+-----------------+--------+
|    1 |             700 |      1 |
|    2 |             600 |      1 |
|    3 |            2100 |      1 |
+------+-----------------+--------+

select * from employee_salary_change;

+------+-----------------+--------+
| ID   | Employee_Salary | Active |
+------+-----------------+--------+
|    1 |             500 |      0 |
|    2 |             600 |      1 |
|    3 |            2100 |      1 |
|    1 |             700 |      1 |
+------+-----------------+--------+

Я предполагаю, что ваша таблица employee_salary_change упрощена для целей вопроса, поэтому я не проверял, существует ли такая же зарплата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...