2017-05-26 15 views
0

テーブルに重複したエントリを持つ約5人のユーザーのリストがあります。 ここには、重複したエントリを取得するために使用したクエリがあります。少数のエントリを削除する簡単な方法を提案してください。テーブル内のいくつかの重複行を削除する

USE [DB] 

SELECT UserName, COUNT(*) AS CountOF 
FROM UserDetails 
WHERE RoleID = '2' 
GROUP BY UserName 
HAVING COUNT(*) > 1 
+1

を必要とするが、あなたは、MySQL(およびないSQL Server)を使用していますか?テーブルの構造は何ですか? –

+0

私はSQL Serverを使用しています。間違ったタグが残念です – beginner

答えて

3

大括弧を使用すると、SQL Serverが推奨されます。もしそうなら、あなたが行うことができます:

WITH todelete as (
     SELECT ud.*, 
      ROW_NUMBER() OVER (PARTITION BY RoleId, username ORDER BY RoleId) as seqnum 
     FROM UserDetails 
     WHERE RoleID = 2 
    ) 
DELETE FROM todelete 
    WHERE seqnum > 1; 

注:RoleIdが数値の場合、その文字列に値を比較しません。

+0

はい役割IDは数字です。 2つの重複したエントリがある場合、上記のクエリは1つの権利を削除しますか? – beginner

+0

このロジックは、 'RoleId = 2'の各' username'に対して1つの値を保持します。 –

+0

ありがとうございました。私はこれを試してみましょう – beginner

0

IDまたはCREATETIME のような別のuniqの列より多くのデータベースのサポート

with repeatData as (
    SELECT UserName,COUNT(*) as CountOF,min(id) as keepTag FROM UserDetails 
    WHERE RoleID = '2' 
    GROUP BY UserName 
    HAVING COUNT(*)>1), 
toDelData as (
    select id from UserDetails 
    where UserName in (SELECT UserName from repeatData) 
    and id not in (SELECT keepTag from repeatData)) 
delete FROM UserDetails where id in (select id from toDelData) 
関連する問題