トピックリンクします。https://leetcode-cn.com/problems/delete-duplicate-emails/
タイトル
削除するには、SQLクエリを書くPerson
テーブルにすべての重複メールを、重複したメールボックスはのみ保持Id
最小のもの。
+ ---- + ------------------ +
| ID |メール|
+ ---- + -------------- + ----
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
+ ---- + ------------ + ------
Idは、このテーブルの主キーです。
クエリを実行した後、例えば、上記のPersonテーブルには、次の行を返す必要があります:
+ ---- + ------------------ +
| 同上| メール|
+ ---- + ------------------ +
| 1 | [email protected] |
| 2 | [email protected] |
+ ---- + ------------------ +
出典:ボタン(LeetCode)に滞在
します。https://leetcode-cn.com/problems/delete-duplicate-emailsリンク
すべてのネットワークからの控除が著作権を保有します。商業転載は許可公式、非商用の転載は、ソースを明記してくださいお問い合わせください。
答え
私は、ああ、非常に単純感じるようになったgroup by
問題を解決しますが、対象となる場合がありで、明確に述べgroup by
提出が経過していない、ローカルテストをするために必要な要件と推定されているdelete
代わりに、操作select
。
---- MySQL ----
select min(Id) as Id,
Email
from Person
group by Email; -- 简单 只是不通过
答えの後に公式の回答を参照してください。
使用するdelete
と、where
句の答え。
---- MySQL ----
# Write your MySQL query statement below
delete a from Person a,
Person b
where a.Email = b.Email
and a.Id > b.Id ---- 707ms
以下のためMySQL
の構文ではまだ馴染みのないoracle
多少異なります。
エイリアスとテーブル名場合は、追加するエイリアスを削除します。
left join
試してみます。
---- MySQL ----
delete a from Person a
left join Person b
on a.Email = b.Email
where a.Id > b.Id; ---- 726ms
することによりdelete
、サブクエリを+、そしてより効率的。
---- MySQL ----
delete from Person
where Id not in
(
select Id
from
(
select min(Id) as Id
from Person
group by Email
) b
); ---- 506ms
カドガン層select
ためdelete
とselect
テーブルの上に動作することはできません、外層クエリは一時テーブルを作成した後、この方法は、あなたがすることができます追加されdelete
動作します。
考えます
2 IDのサイズを決定することによってセルフライゲーション後、それを削除します。
delete
操作は非常に奇妙である、すべての後に、通常より多くのまたは使用select
の操作のみOK、データを照会する必要があります。