在一个单独的表oracle sql中递归删除依赖行

时间:2017-11-01 02:06:01

标签: sql oracle plsql foreign-keys recursive-query

对于标准的ORACLE sql示例表EMP,架构包含EMPNO是主键,MGR是当前员工的直接管理器的EMPNO(外键是指表本身)。

问题1:如何编写递归sql过程来删除一个管理器并诅咒删除在该管理器下工作的所有人  ,包括那些没有直接向他或她报告的人?

问题2:可以通过从重复基表创建的视图中删除来完成吗?

2 个答案:

答案 0 :(得分:0)

可以使用单个删除语句完成。

您需要使用HIERARCHICAL查询选择层次结构中的所有员工,然后将其删除。

例如,删除标准ORACLE sql示例表7566中的EMPNO EMP(JONES)下的所有员工

DELETE FROM EMP WHERE EMPNO IN 
(SELECT EMPNO
FROM   EMP
CONNECT BY PRIOR EMPNO = MGR
START WITH   EMPNO=7566);

一切顺利:)

答案 1 :(得分:0)

是的,可以根据表格使用 VIEW ,并在视图上使用 INSTEAD OF DELETE ON 触发器。

根据员工表创建视图

CREATE VIEW EMPLOYEE_VIEW AS SELECT * FROM EMPLOYEES;

在视图上创建以下触发器

CREATE OR REPLACE TRIGGER EMPLOYEE_VIEW_DEL INSTEAD OF DELETE ON 
EMPLOYEE_VIEW 
FOR EACH ROW
BEGIN
    DELETE FROM EMPLOYEES WHERE MANAGER_ID =:OLD.EMPLOYEE_ID;

END;
/

这应该可行,这样可以避免变异表错误ORA-04091变异表错误!

和平!