2016-04-11 7 views
0

に我々は電子メール上記の場合削除クエリ

SELECT email, COUNT(email) 
FROM users 
GROUP BY email 
HAVING (COUNT(email) > 1) 

の複製を返し、次のSQLクエリを持っているとしましょう「を持つ」を使用しながら、どのように我々は、実際にそれらの重複行を削除することができますか?または重複のいずれか1つのみが重複しないようにしますか?

+0

あなたの主キーが 'ユーザ 'であると仮定すると、あなたはどの2人のユーザを削除したいでしょうか? – JNevill

+0

[重複するエントリを削除するには?](http://stackoverflow.com/questions/1746213/how-to-delete-duplicate-entries) –

答えて

3

一つの方法はctid使用:

delete from users 
    where ctid not in (select min(ctid) 
         from users 
         group by email 
        ); 

これは、各電子メールの全てが、1つの行を削除します。 ctidは内部行識別子です。ユーザー定義の主キー列を使用する方がよいでしょう。

+0

* 'ユーザーから削除する ' – JNevill

+0

@Abelisto。 。 。私はそれがどうやって行うのか分かりません。 @Abelisto。 –

+0

。 。これにより、すべての行が電子メールごとに1つずつ削除されます。 –

2

この方法では、主キーまたは一意の識別子がなくても、テーブルからレコードを削除できます。

WITH CTE AS 
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY email ORDER BY email) AS RN 
FROM users 
) 

DELETE FROM CTE WHERE RN > 1 
関連する問題