SQL 删除被其他表参照的记录

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 的部门)。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程