SQL 删除被其他表参照的记录,如果表里的一些记录会被其他表所参照的话,你想删除它们。考虑如下所示的 DEPT_ACCIDENTS
表,该表的每一行数据代表一起制造业生产事故。每一行都记录了发生事故的部门以及事故的类型。
SQL 删除被其他表参照的记录 问题描述
如果表里的一些记录会被其他表所参照的话,你想删除它们。考虑如下所示的 DEPT_ACCIDENTS
表,该表的每一行数据代表一起制造业生产事故。每一行都记录了发生事故的部门以及事故的类型。
create table dept_accidents
( deptno integer,
accident_name varchar(20) )
insert into dept_accidents values (10,'BROKEN FOOT')
insert into dept_accidents values (10,'FLESH WOUND')
insert into dept_accidents values (20,'FIRE')
insert into dept_accidents values (20,'FIRE')
insert into dept_accidents values (20,'FLOOD')
insert into dept_accidents values (30,'BRUISED GLUTE')
select * from dept_accidents
DEPTNO ACCIDENT_NAME
---------- --------------------
10 BROKEN FOOT
10 FLESH WOUND
20 FIRE
20 FIRE
20 FLOOD
30 BRUISED GLUTE
对于发生了 3 件以上事故的部门,你希望从 EMP 表里删除掉这些部门的全部员工记录。
SQL 删除被其他表参照的记录 解决方案
使用子查询和聚合函数 COUNT
找出发生过 3 次以上事故的部门,然后再删除在上述部门工作的员工。
1 delete from emp
2 where deptno in ( select deptno
3 from dept_accidents
4 group by deptno
5 having count(*) >= 3 )
SQL 删除被其他表参照的记录 扩展知识
下面的子查询用于识别哪些部门发生过 3 次以上事故。
select deptno
from dept_accidents
group by deptno
having count(*) >= 3
DEPTNO
----------
20
DELETE
语句会删除上述子查询返回的那些部门的全部员工(本例中只是部门编号等于 20 的部门)。