如何使用子查询中删除/更新查询在MySQL

如何使用子查询中删除/更新查询在MySQL

问题描述:

我使用的是MySQL 5.0.77数据库使用查询:如何使用子查询中删除/更新查询在MySQL

Delete from IPADDRESS 
where visitdate Not in (SELECT max(visitdate) FROM IPADDRESS WHERE USERNAME='MGSH0002') 
and USERNAME='MGSH0002' 

执行时,我收到此错误:

你可以从子句中指定目标表IPADDRESS用于更新

+0

为什么这是用java标签?移动到mysql – Jayan 2012-03-28 12:30:11

不能,不幸的是,MySql不允许这样做。

当前,您无法更新表并从 中的同一表中选择子查询。

来源:

http://dev.mysql.com/doc/refman/5.0/en/update.html

+0

thanku 4 ur ans但是有没有其他方法可以做同样的工作 – manorma 2012-03-28 12:39:55

当然不是最好的解决办法,但对于你的问题,这将这样的伎俩:

delete i1 from 
    IPADDRESS i1, 
    IPADDRESS i2 
where 
    i1.username = i2.username 
    and i1.username = 'MGSH0002' 
    and i1.visitdate < i2.visitdate 

的替代性和更聪明的解决方案是下面的语句:

delete i1 from 
    IPADDRESS i1, 
    (select max(visitdate) visitdate from IPADDRESS where username = 'MGSH0002') temp 
where 
    i1.username = 'MGSH0002' 
    and i1.visitdate < temp.visitdate 
+0

thnks这是工作我有一个更多的查询“删除从IPADDRESS where visitdate不在(SELECT visitdate FROM(SELECT visitdate FROM IPADDRESS WHERE USERNAME ='MGSH0002 'ORDER BY visitdate DESC)其中ROWNUM manorma 2012-03-28 13:01:00

+1

第二种解决方案当然要聪明得多。它可能需要'group by username'成为'temp'子查询中的WHERE username ='MGSH0002'',但它比第一个好。并且如果有'(用户名,访问日期)的索引,则速度更快' – 2012-03-29 06:45:02

+0

Thx ypercube!我想编辑我的第二个解决方案,现在我们有了一个聪明的解决方案。 – GreenTurtle 2012-03-29 11:31:46