[Err] 1093 - You can't specify target table 'bbb_copy' for update in FROM clause
有一张表 表明 bbb_copy
id name score
1 java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80
6 servlet 80
首先想到的是这个sql语句
用子查询把分组name score相同的列查询到,
delete from bbb_copy where id not in(select min(a.id) id from bbb_copy a group by a.name,a.score)
但是报错了
[SQL] delete FROM bbb_copy
where id not in(select min(a.id) id from bbb_copy a
group by a.name,a.score)
[Err] 1093 - You can't specify target table 'bbb_copy' for update in FROM clause
我以为自己子表出现了错误,但是一查询,是对的
select min(a.id) id from bbb_copy a group by a.name,a.score
id
1
4
2
5
3
然后更改一下第一个sql 看看能不能成功,
delete FROM bbb_copy where id not in(1,4,2,5,3)
成功了,这就另人非常费解了。 因为第一个sql的子查询正确 但是不好使,然后把结果集冲动写在in()中,竟然好使了。
然后上网查询资料
报错信息如下:
错误代码: 1093
You can't specify target table 'sc' for update in FROM clause
意思是不能在同一语句中更新select出的同一张表元组的属性值
解决方法:将select出的结果通过中间表再select一遍即可。
然后自己就按照他的解决方法实验了一下。
delete FROM bbb_copy
where id not in(select b.* from (select min(a.id) id from bbb_copy a
group by a.name,a.score) b)
[SQL] delete FROM bbb_copy
where id not in(select b.* from (select min(a.id) id from bbb_copy a
group by a.name,a.score) b)
受影响的行: 1
时间: 0.055ms
成功了!!!
总结一下。
如果在增删改语句中,要使用子查询的形式进行增删改,那么应该把这个子查询进行第二次select一下 才可以执行。
这个第二次select实际上就是把第一次的select的结果集放在临时表中。
其实想想也是这样的,对同一张表查的同时更新会引起数据不一致的问题吧,但是将查询结果事先放到临时表中就不会有这个问题了