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

MariaDBで重複する行を削除する2つの方法(主キーを無視します)

    これらの行に主キーまたは一意の識別子列がある場合に、MariaDBのテーブルから重複する行を削除する例を次に示します。

    例では、重複する行を削除しますが、1つは保持します。したがって、2つの同一の行の場合、一方を削除し、もう一方を保持します。

    サンプルデータ

    この例では、次のデータを使用しています。

    SELECT * FROM Dogs;

    結果:

    +-------+-----------+----------+
    | DogId | FirstName | LastName |
    +-------+-----------+----------+
    |     1 | Bark      | Smith    |
    |     2 | Bark      | Smith    |
    |     3 | Woof      | Jones    |
    |     4 | Ruff      | Robinson |
    |     5 | Wag       | Johnson  |
    |     6 | Wag       | Johnson  |
    |     7 | Wag       | Johnson  |
    +-------+-----------+----------+

    最初の2行と、最後の3行が重複していることがわかります。

    DogId 列は一意の値を保持するため(テーブルの主キーであるため)、厳密に言えば、重複はありません。しかし、実際の状況では、主キーを含むテーブルの重複を排除したい場合がよくあります。したがって、この記事では主キーを無視し、残りの列で重複する値を検出します。

    オプション1

    削除するすべての行を選択して、最初のオプションを開始しましょう:

    SELECT * FROM Dogs 
    WHERE DogId IN (
        SELECT DogId FROM Dogs 
        EXCEPT SELECT MIN(DogId) FROM Dogs 
        GROUP BY FirstName, LastName
        );

    結果:

    +-------+-----------+----------+
    | DogId | FirstName | LastName |
    +-------+-----------+----------+
    |     2 | Bark      | Smith    |
    |     6 | Wag       | Johnson  |
    |     7 | Wag       | Johnson  |
    +-------+-----------+----------+

    これらの重複する行を削除するには、SELECT *を切り替えることができます DELETEへ :

    DELETE FROM Dogs 
    WHERE DogId IN (
        SELECT DogId FROM Dogs 
        EXCEPT SELECT MIN(DogId) FROM Dogs 
        GROUP BY FirstName, LastName
        );

    結果:

    Query OK, 3 rows affected (0.017 sec)

    結果を確認するために、テーブル内の残りのすべての行を選択できます。

    SELECT * FROM Dogs;

    結果:

    +-------+-----------+----------+
    | DogId | FirstName | LastName |
    +-------+-----------+----------+
    |     1 | Bark      | Smith    |
    |     3 | Woof      | Jones    |
    |     4 | Ruff      | Robinson |
    |     5 | Wag       | Johnson  |
    +-------+-----------+----------+

    代わりに、MAX()を使用することもできます MIN()の代わりに関数 削除する行を変更する関数。

    オプション2

    この例では、テーブルが元の状態に(重複して)復元されていると想定します。

    次のクエリを使用して、重複する行をチェックできます。

    SELECT * 
    FROM Dogs d1, Dogs d2 
    WHERE d1.FirstName = d2.FirstName 
    AND d1.LastName = d2.LastName
    AND d1.DogId <> d2.DogId 
    AND d1.DogId = (
        SELECT MAX(DogId) 
        FROM Dogs d3 
        WHERE d3.FirstName = d1.FirstName 
        AND d3.LastName = d1.LastName
    );

    結果:

    +-------+-----------+----------+-------+-----------+----------+
    | DogId | FirstName | LastName | DogId | FirstName | LastName |
    +-------+-----------+----------+-------+-----------+----------+
    |     2 | Bark      | Smith    |     1 | Bark      | Smith    |
    |     7 | Wag       | Johnson  |     5 | Wag       | Johnson  |
    |     7 | Wag       | Johnson  |     6 | Wag       | Johnson  |
    +-------+-----------+----------+-------+-----------+----------+

    そして、そのクエリを変更して重複を削除できます:

    DELETE FROM Dogs WHERE DogId IN (
        SELECT d2.DogId 
        FROM Dogs d1, Dogs d2 
        WHERE d1.FirstName = d2.FirstName 
        AND d1.LastName = d2.LastName 
        AND d1.DogId <> d2.DogId 
        AND d1.DogId=( 
            SELECT MIN(DogId) 
            FROM Dogs d3 
            WHERE d3.FirstName = d1.FirstName 
            AND d3.LastName = d1.LastName
        )
    );

    結果:

    Query OK, 3 rows affected (0.075 sec)

    これで、テーブルの重複が解除されました。

    これは、すべての行を再度選択することで確認できます:

    SELECT * FROM Dogs;

    結果:

    +-------+-----------+----------+
    | DogId | FirstName | LastName |
    +-------+-----------+----------+
    |     1 | Bark      | Smith    |
    |     3 | Woof      | Jones    |
    |     4 | Ruff      | Robinson |
    |     5 | Wag       | Johnson  |
    +-------+-----------+----------+

    MAX()を使用できます MIN()の代わりに 必要に応じて、重複から他の行を削​​除します。


    1. OracleデータベースからExcelスプレッドシートを作成する

    2. PostgreSQLUNIXドメインソケットとTCPソケット

    3. BETWEEN句と<=AND>=

    4. SYS_CONNECT_BY_PATH関数を使用する場合のOracleORA-30004、