You can‘t specify target table ‘Person‘ for update in FROM clause
3817 ワード
タイトル:SQLクエリーを作成して、Personテーブルのすべての重複する電子メールを削除して、重複するメールボックスの中でIdの最小のそれだけを残します.
Idはこのテーブルのプライマリ・キーです.たとえば、クエリー文を実行した後、上のPersonテーブルには次の行が返されます.
ヒント:SQLを実行すると、出力はPersonテーブル全体です.delete文を使用します.
エラーの答え:
この文を実行するとエラーが表示されます.You can't specify target table'Person'for update in FROM clause
これはMySQLが同時に1枚の表を検索して削除することを許さないためで、私達はサブクエリの方式を通じて包装してこの間違いを避けることができます
+----+------------------+
| 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
)