首页 > 解决方案 > 替换 PL/SQL 触发器中的子查询

问题描述

我有 2 张桌子。一个叫Employee另一个Employee_jobs。表中的字段之一Employeejob_name。该Employee_jobs表包含 2 个字段,job_nameEmp_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;
/

我仍然需要做更新部分,但我想先让它工作。我意识到不允许在逻辑块中使用子查询,但我不确定如何替换该语句。我认为我需要检查第二个表中是否已经存在该作业,并根据该表采取不同的操作。

我需要使用触发器来实现这一点。

标签: sqlplsqltriggers

解决方案


您可以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)

推荐阅读