You can‘t specify target table ‘Person‘ for update in FROM clause

3817 ワード

タイトル:SQLクエリーを作成して、Personテーブルのすべての重複する電子メールを削除して、重複するメールボックスの中でIdの最小のそれだけを残します.
+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+

Idはこのテーブルのプライマリ・キーです.たとえば、クエリー文を実行した後、上のPersonテーブルには次の行が返されます.
+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+
 

ヒント:SQLを実行すると、出力はPersonテーブル全体です.delete文を使用します.


  • エラーの答え:

  • delete from Person
    where Id not in
    (select min(id) from Person
    group by Email)
    

    この文を実行するとエラーが表示されます.You can't specify target table'Person'for update in FROM clause
    これはMySQLが同時に1枚の表を検索して削除することを許さないためで、私達はサブクエリの方式を通じて包装してこの間違いを避けることができます
    delete from Person
    where Id not in
    (select id from
    (select min(id) as id from Person
    group by Email) as t
    )