3

このクエリがあります

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

一時テーブルを作成し、サブクエリの結果を保持してから、UPDATE を実行できます。しかし、私はこのようにしたくありません。誰かがこれを行うためのより良い方法を提案できますか?

4

2 に答える 2

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
于 2012-11-02T01:58:39.970 に答える
-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)
于 2012-11-02T02:06:25.953 に答える