0

3列のデータベーステーブルがあります。Id、user_id、book_id。この表には、いくつかの重複があります。user_idにはbook_idのレコードが1つだけ含まれている必要がありますが、場合によっては、user_idに複数のbook_idが含まれています。すでに数百万のレコードがあり、重複を削除する方法を考えています。

4

3 に答える 3

1

以下をお試しください。

SQLサーバー

WITH ORDERED AS
(
    SELECT id
    ROW_NUMBER() OVER (PARTITION BY [user_id] , [book_id] ORDER BY id ASC) AS rn
    FROM
    tableName
)
delete from tableName
where id in ( select id from ORDERED where rn != 1)

MYSQL

delete from tableName
where id not in( 
    select MIN(id)from tableName    
    group by user_id, book_id
)

コメントに従って編集-MySQLでは、SELECT部分​​で使用するのと同じテーブルを変更することはできません

これで問題は解決します。

delete from tableName
where id not in( 
    select temp.temp_id from (
        select MIN(id) as temp_id from tableName    
        group by user_id, book_id
    ) as temp
)

これにより、(user_id、book_id)の組み合わせが1つだけ保持されます。

于 2013-03-08T12:13:42.403 に答える
0

以下のこのステートメントを実行すると、の重複レコードがすべて削除され、それぞれuser_IDに最大のものだけが残ります。IDuser_ID

DELETE  a
FROM    tableName a
        LEFT JOIN
        (
            SELECT  user_ID, MAX(ID) max_ID
            FROM    tableName
            GROUP   BY user_ID
        ) b ON a.user_ID = b.user_ID AND
                a.ID = b.max_ID
WHERE   b.max_ID IS NULL
于 2013-03-08T12:10:32.683 に答える
0

このクエリで重複を削除できることを願っています。

DELETE bl1 FROM book_log bl1
JOIN book_log bl2
ON (
    bl1.id > bl2.id AND
    bl1.user_id = bl2.user_id AND
    bl1.book_id = bl2.book_id
);

デモ

于 2013-03-08T12:47:22.893 に答える