sql - 替换 PL/SQL 触发器中的子查询
问题描述
我有 2 张桌子。一个叫Employee
另一个Employee_jobs
。表中的字段之一Employee
是job_name
。该Employee_jobs
表包含 2 个字段,job_name
和Emp_count
(每个职位的员工人数)。我想做的是每当我在Employee
桌子上执行操作时,它就会自动调整Employee_jobs
桌子。这基本上意味着我必须从第一个表中添加所有工作名称,并将每个工作的人数计算到第二个表中。这就是我想出的。
CREATE OR REPLACE TRIGGER TR_JOB_UPDATE
AFTER INSERT OR UPDATE OR DELETE
ON EMPLOYEE
FOR EACH ROW
BEGIN
IF inserting THEN
IF :NEW.JOB_NAME IN(Select JOB_NAME FROM EMPLOYEE_JOBS) THEN
UPDATE EMPLOYEE_JOBS
SET EMP_COUNT = EMP_COUNT + 1 WHERE JOB_NAME = :NEW.JOB_NAME;
ELSE
insert into EMPLOYEE_JOBS(JOB_NAME)
VALUES(:NEW.JOB_NAME);
END IF;
ELSIF deleting THEN
UPDATE EMPLOYEE_JOBS
SET EMP_COUNT = EMP_COUNT - 1 WHERE JOB_NAME = :NEW.JOB_NAME;
END IF;
END;
/
我仍然需要做更新部分,但我想先让它工作。我意识到不允许在逻辑块中使用子查询,但我不确定如何替换该语句。我认为我需要检查第二个表中是否已经存在该作业,并根据该表采取不同的操作。
我需要使用触发器来实现这一点。
解决方案
您可以MERGE
按如下方式使用该语句:
merge into EMPLOYEE_JOBS ej
using (select :NEW.JOB_NAME as new_job_name from dual) as j
on (ej.JOB_NAME = j.new_job_name)
when matched then
update set ej.emp_count = ej.emp_count + case when deleting then -1 else 1 end
when not matched then
insert (job_name, emp_count) values (:NEW.JOB_NAME, 1)
推荐阅读
- bash - 试图让用户看到letsencrypt密钥
- c++ - 如何使用openssl EVP解密?
- linker - 使用 arm-none-eabi-gcc 编译器为 RaspberryPI2 和 BeableBoneBlack 编译 sqrt 函数时出错
- r - R Barplot Animation 截断的条形图
- asp.net - 如何使用 axios.put 将 JSON 发送到 ASP.NET 控制器
- python - 如何使用 Python 中的排序算法对列表字典进行排序?
- r - 如何使用 R 以摘要格式构造数据
- c# - ASP.Net Core、Entity Framework 和 MySQL 给出了 Create 异常?任何想法为什么?
- database - Entity Framework Core 一对多相关数据导航属性始终为空
- python - python gpg.decrypt 输出文件为空