0

大文字と小文字を区別しない重複があるテーブル内のエントリのリストを選択してから削除したいと思います。

言い換えると、これらの行は一意です... ..しかし、大文字と小文字を区別しない場合、これらの行は一意ではありません。私が見ていなかった間に彼らは入った。

では、削除するIDを見つけるために、列を選択するにはどうすればよいですか?(両方の重複を削除しても問題ありません)。

単純なサンプル列構造:

player_id | uname
------------------
34        | BOB
544       | bob
etc...
4

1 に答える 1

2

維持するプレーヤー(最初に登録したと仮定)

SELECT min(player_id) as player_id
FROM players
GROUP BY lower(uname)

これを使用して、削除するユーザーとそれに対応するキーパーを配置します。

SELECT 
    players.player_id delete_id,
    players.uname delete_uname,
    keepers.uname keeper_uname,
    keepers.player_id keeper_id    
FROM players JOIN 
    (
        SELECT p.player_id, p.uname
        FROM players p JOIN
        (
            SELECT min(player_id) player_id
              FROM players
          GROUP BY lower(uname)
        ) as keeper_ids
        ON (p.player_id = keeper_ids.player_id)     
    ) as keepers
    ON (lower(players.uname) = lower(keepers.uname) AND players.player_id <> keepers.player_id)
ORDER BY keepers.player_id, players.player_id 

出力:

delete_id | delete_uname | keeper_uname | keeper_id
---------------------------------------------------
544       | bob          | BOB          | 34
于 2010-10-15T00:06:06.380 に答える