LeetCode :. 196削除重複した電子メール

トピックリンクします。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ためdeleteselectテーブルの上に動作することはできません、外層クエリは一時テーブルを作成した後、この方法は、あなたがすることができます追加されdelete動作します。

考えます

2 IDのサイズを決定することによってセルフライゲーション後、それを削除します。

delete操作は非常に奇妙である、すべての後に、通常より多くのまたは使用selectの操作のみOK、データを照会する必要があります。

おすすめ

転載: www.cnblogs.com/hider/p/11746422.html