sql >> データベース >  >> RDS >> Mysql

MySQLは重複レコードを削除します

    MySQLで重複レコードを削除したり、重複行を削除したりする必要がある場合があります。 MySQLで重複レコードを削除する方法は主に3つあります。 MySQLで重複レコードを削除する方法は次のとおりです。

    MySQL重複レコードの削除

    MySQLで重複レコードを削除する手順は次のとおりです。次のテーブルがあるとしますdup_orders(id、amount) レコードが重複しています。

    mysql> create table dup_orders(id int, amount int);
    
    mysql> insert into dup_orders(id,amount) values(1, 100),(1,250),(2,350),(2,350);
    
    mysql> select * from dup_orders;
    +------+--------+
    | id   | amount |
    +------+--------+
    |    1 |    100 |
    |    1 |    250 |
    |    2 |    350 |
    |    2 |    350 |
    +------+--------+
    

    ボーナスリード:MySQLで重複レコードを取得する方法

    MySQLで重複する行を削除する方法

    MySQLで重複レコードを削除する3つの方法のそれぞれを見てみましょう。

    1。中間テーブルを使用して重複レコードを削除する

    この方法には3つのステップがあります。まず、 dup_orders から、重複のない行を選択します テーブルを作成し、それらを別のテーブルに挿入します。構文は次のとおりです。

    CREATE TABLE [copy_of_source] SELECT DISTINCT [columns] FROM [source_table];
    

    これが、dup_ordersから別のテーブルに個別の行を選択するためのクエリです。

    mysql> CREATE TABLE dup_orders_copy SELECT DISTINCT id,amount FROM dup_orders;
    
    mysql> select * from dup_orders_copy;
    +------+--------+
    | id   | amount |
    +------+--------+
    |    1 |    100 |
    |    1 |    250 |
    |    2 |    350 |
    +------+--------+
    

    上記のクエリは、重複する行、つまりすべての列の重複する値を削除します。

    すべてではなく1つ以上の列の値が重複している行を削除する場合は、上記のクエリでGROUPBY句を使用できます。たとえば、テーブル内のID列の値が重複している行のみが必要な場合は、次のクエリを使用します。

    mysql> CREATE TABLE dup_orders_copy SELECT id,amount FROM dup_orders group by id;
    
    mysql> select * from dup_orders_copy;
    +------+--------+
    | id   | amount |
    +------+--------+
    |    1 |    100 |
    |    2 |    350 |
    +------+--------+
    

    中間テーブルを作成したら、元のテーブルを削除します。

    mysql> drop table dup_orders;
    

    最後に、中間テーブルの名前を元のテーブルに変更します。

    mysql> alter table dup_orders_copy rename to dup_orders;
    
    mysql> select * from dup_orders;
    +------+--------+
    | id   | amount |
    +------+--------+
    |    1 |    100 |
    |    2 |    350 |
    +------+--------+
    

    ボーナスリード:MySQLが独自の制約を追加

    2。 INNERJOINを使用して重複する行を削除します

    DELETEステートメントとINNERJOINステートメントの組み合わせを使用して、重複する行を削除することもできます。ただし、この場合、テーブルには少なくとも1つの一意の列(主キーなど)が必要です。次のdup_ordersがあるとします。 金額が重複しているテーブル 値ですが一意のid 値。

    mysql> insert into dup_orders(id,amount) values(1, 100),(2,250),(3,350),(4,350);
    
    mysql> select * from dup_orders;
    +------+--------+
    | id   | amount |
    +------+--------+
    |    1 |    100 |
    |    2 |    250 |
    |    3 |    350 |
    |    4 |    350 |
    +------+--------+
    

    INNER JOINを使用して上記のテーブルをそれ自体と結合し、次のクエリを使用して重複する行を削除できます。

    mysql> DELETE t1 FROM dup_orders t1
           INNER JOIN dup_orders t2
           WHERE
               t1.id < t2.id 
               AND t1.amount = t2.amount;
    +------+--------+
    | id   | amount |
    +------+--------+
    |    1 |    100 |
    |    2 |    250 |
    |    4 |    350 |
    +------+--------+
    

    上記のクエリは、重複する各行の行の最大IDを保持します。 IDが最小の行を保持する場合は、次のクエリを使用します。

    mysql> DELETE t1 FROM dup_orders t1
           INNER JOIN dup_orders t2
           WHERE
               t1.id >> t2.id 
               AND t1.amount = t2.amount;
    

    ボーナス読み取り:MySQLの名前変更列

    3。 ROW_NUMBER()を使用して重複レコードを削除する

    8.0.2以降で使用可能なROW_NUMBER()関数を使用して、テーブルから重複レコードを削除することもできます。重複する行の行番号を取得するSQLクエリは次のとおりです

    SELECT *. ROW_NUMBER () Over (PARTITION BY [column] 
    ORDER BY [column]) as [row_number_name];
    

    dup_ordersテーブルの行番号を取得するためのクエリは次のとおりです

    SELECT *. ROW_NUMBER () Over (PARTITION BY id ORDER BY id) 
    as row_number from dup_orders;
    

    以下に示すように、これをSQLクエリのサブクエリとして使用して、重複する行を削除します

    DELETE FROM dup_orders
    WHERE id IN (
        SELECT id
        FROM (
            SELECT 
                id, 
                ROW_NUMBER () Over (PARTITION BY id ORDER BY id) as row_number 
               from dup_orders
        ) t
        WHERE row_number > 1
    )
    

    うまくいけば、My​​SQLで重複レコードを簡単に削除できるようになりました。

    Ubiqを使用すると、データを数分で簡単に視覚化し、リアルタイムのダッシュボードで監視できます。今日お試しください。

    1. エイリアスによるグループ化(Oracle)

    2. SQLDeveloperの12cアダプティブプラン

    3. SQLite-テーブルをドロップ

    4. mysqlで単一のキーワードを持つ単一のwhere条件を使用してテーブルのすべての列を検索します