2012-11-02 36 views
2

更新我有这个疑问ERROR 1093(HY000):您不能指定目标表“A”在FROM子句

UPDATE trh_adminLoginDate SET superseded = true WHERE EXISTS 
(SELECT * FROM trh_adminLoginDate AS a2 WHERE a2.adminId = a.adminId AND a2.loginDate > a.loginDate AND a2.clientPlatform = a.clientPlatform) 

和表这个样子的。

+----------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+----------------+--------------+------+-----+---------+----------------+ 
| id    | bigint(20) | NO | PRI | NULL | auto_increment | 
| dateCreated | datetime  | NO |  | NULL |    | 
| version  | int(11)  | NO |  | NULL |    | 
| dateModified | datetime  | NO |  | NULL |    | 
| adminId  | bigint(20) | NO | MUL | NULL |    | 
| clientPlatform | varchar(255) | YES |  | NULL |    | 
| loginDate  | datetime  | YES |  | NULL |    | 
| superseded  | tinyint(1) | NO |  | NULL |    | 
+----------------+--------------+------+-----+---------+----------------+ 

当我执行此查询,我得到下面的错误:

ERROR 1093 (HY000): You can't specify target table 'a' for update in FROM clause 

我可以创建临时表,并保持子查询的结果,然后做更新。但我不想这样做。有人可以告诉我更好的方法吗?

回答

4

您正在使用别名“a”,但您从未定义它。

也许这会工作:

UPDATE trh_adminLoginDate a 

     JOIN trh_adminLoginDate AS a2 
     ON a2.adminId = a.adminId 
     AND a2.loginDate > a.loginDate 
     AND a2.clientPlatform = a.clientPlatform 

SET a.superseded = true 
+0

感谢...它的工作。 – Rakesh

-1

或者,也许这将这样的伎俩:

UPDATE trh_adminLoginDate a 

SET superseded = true 

WHERE EXISTS 
     (SELECT * FROM trh_adminLoginDate WHERE adminId = a.adminId AND loginDate > a.loginDate AND clientPlatform = a.clientPlatform) 
+1

我得到同样的错误。 – Rakesh

+0

此查询适用于SQL,但不适用于HQL。你可以给我提供HQL版本吗? – Rakesh

+0

我不使用HQL。抱歉。 – Tom

相关问题