mysql中有这样的限制:
1.delete或update后面的子查询不能和主句中的表一致。
解决方法:
1、把子查询的结果创建临时表存储
2、把这个临时表作为原表删除的条件
下面通过案例来理解上面的意义
要求:
1. 删除10号部门薪水最高的员工
数据表
创建emp的sql语句
create table emp(
empno int primary key auto_increment,
ename varchar(10),
JOB varchar(9),
MGR int,
HIREDATE date,
SAL int,
COMM int,
DEPTNO int not null
);
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-06-13',3000,NULL,20);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-06-13',1100,NULL,20);
INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1983-01-23',1300,NULL,10);
要求:
1. 删除10号部门薪水最高的员工
解题思路(正确答案是第四步)
第一步:先获取10号部门最高的薪水
select max(sal) from emp where deptno=10
查询结果如下图:
第二步:删除10号部门最高薪水的员工(此处有陷阱)
delete from emp
where sal =(select max(sal) from emp where deptno=10)
执行上面的代码时,会出现错误,因为子查询中的表和主句中的表一样,
所以我们要将子查询表再封装成一个临时表,看下面第三步
第三步:删除10号部门最高薪水的员工(此处仍然有陷阱)
delete from emp
where sal =(select * from (select max(sal) from emp where deptno=10) as temp)
此查询语句会将最高薪水的员工进行删除,万一其他部门也有5000薪水的人就也会删除,
而我们要删除的是10号部门的最高薪水员工,所以代码还需要加个条件deptno=10
第四步:删除10号部门最高薪水的员工(正确答案)
扫描二维码关注公众号,回复:
1756015 查看本文章
delete from emp
where sal =(select * from (select max(sal) from emp where deptno=10) as temp)
and deptno=10