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

SQLServerで重複する行を削除する

    次の例では、T-SQLを使用してSQLServerの重複行を削除します。

    具体的には、重複する行を削除しますが、1つは保持します。したがって、同じ行が2つある場合は、一方を削除してもう一方を保持します。つまり、テーブルの重複を排除します。

    サンプルデータ

    次のデータを含むテーブルがあるとします。

    SELECT * FROM Pets;

    結果:

    +---------+-----------+-----------+
    | PetId   | PetName   | PetType   |
    |---------+-----------+-----------|
    | 1       | Wag       | Dog       |
    | 1       | Wag       | Dog       |
    | 2       | Scratch   | Cat       |
    | 3       | Tweet     | Bird      |
    | 4       | Bark      | Dog       |
    | 4       | Bark      | Dog       |
    | 4       | Bark      | Dog       |
    +---------+-----------+-----------+

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

    重複を選択

    テーブルの重複排除を行う前に、次のクエリを使用して、削除される行を確認できます。

    WITH CTE AS 
        (
            SELECT 
                *, 
                ROW_NUMBER() OVER ( 
                    PARTITION BY PetId, PetName, PetType 
                    ORDER BY PetId, PetName, PetType
                    ) AS Row_Number
            FROM Pets
        )
    SELECT * FROM CTE WHERE Row_Number <> 1;

    結果:

    +---------+-----------+-----------+--------------+
    | PetId   | PetName   | PetType   | Row_Number   |
    |---------+-----------+-----------+--------------|
    | 1       | Wag       | Dog       | 2            |
    | 4       | Bark      | Dog       | 2            |
    | 4       | Bark      | Dog       | 3            |
    +---------+-----------+-----------+--------------+

    重複を削除

    重複する値を削除するには、SELECT *を置き換えることで上記のクエリを変更できます DELETEの最後の行 :

    WITH CTE AS 
        (
            SELECT 
                *, 
                ROW_NUMBER() OVER ( 
                    PARTITION BY PetId, PetName, PetType 
                    ORDER BY PetId, PetName, PetType
                    ) AS Row_Number
            FROM Pets
        )
    DELETE FROM CTE WHERE Row_Number <> 1;

    結果:

    (3 rows affected)

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

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

    SELECT * FROM Pets;

    結果:

    +---------+-----------+-----------+
    | PetId   | PetName   | PetType   |
    |---------+-----------+-----------|
    | 1       | Wag       | Dog       |
    | 2       | Scratch   | Cat       |
    | 3       | Tweet     | Bird      |
    | 4       | Bark      | Dog       |
    +---------+-----------+-----------+

    予想どおり、犬の「Wag」の重複行の1つが削除され、もう1つは残っています。 「Bark」の重複行のうち2つも削除されました。テーブルは正常に重複排除されました。


    1. pg_dumpバージョンの不一致エラーを修正する方法は?

    2. DATE_SUB()の例– MySQL

    3. Oracleにデータを挿入している間は無効な月

    4. エラー:終了していない引用符で囲まれた文字列またはその近く