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

Oracleで重複行を削除する2つの方法

    次のオプションを使用して、OracleDatabaseの重複行を削除できます。

    これらの例では、重複する行を削除しますが、1つは保持します。したがって、たとえば3つの同一の行がある場合、そのうちの2つを削除し、1つを保持します。これは、テーブルの重複排除と呼ばれることがよくあります。

    サンプルデータ

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

    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行も重複していることがわかります。

    この場合、すべての列が重複しています。主キー列はありません。通常、PetIdを期待するかもしれません 列を主キーにしますが、値が重複しているため、主キーにすることはできません。

    主キーの場合、すべての行で一意の値が含まれ、重複はありません。

    とにかく、主キーがない場合でも重複する行を見つけて削除するための2つのオプションを以下に示します。

    オプション1

    上記の表から重複する行を削除するための1つのオプションは次のとおりです。

    DELETE FROM Pets
    WHERE EXISTS (
      SELECT 1 FROM Pets p2 
      WHERE Pets.PetName = p2.PetName
      AND Pets.PetType = p2.PetType
      AND Pets.rowid > p2.rowid
    );
    
    SELECT * FROM Pets;

    結果:

    3 row(s) deleted.
    
    PETID	PETNAME	PETTYPE
    1	Wag	Dog
    2	Scratch	Cat
    3	Tweet	Bird
    4	Bark	Dog

    これで、テーブルの重複が解除されました。 3行が削除され、4行が残っています。

    犬の「Wag」の重複行の1つが削除され、もう1つは残っています。 「Bark」の重複行のうち2つも削除されました。

    Oracleのrowid pseudocolumnを使用すると、この重複排除操作を実行できます。クエリでそれを参照して、削除する行を決定することができました。

    これが機能する方法は、Oracleデータベースの各行にrowidがあります。 行のアドレスを返す疑似列。 rowid はテーブル内の行の一意の識別子であり、通常、その値はデータベース内の行を一意に識別します。したがって、主キーやその他の一意のIDフィールドがない場合でも、各行を識別できます。

    ただし、同じクラスターに一緒に格納されている異なるテーブルの行は、同じrowidを持つ可能性があることに注意してください。 。

    オプション2

    テーブルが元のデータ(重複行を含む)で復元されたと仮定すると、重複行を削除するための別のオプションがあります。

    DELETE FROM Pets
    WHERE rowid > (
      SELECT MIN(rowid) FROM Pets p2  
      WHERE Pets.PetName = p2.PetName
      AND Pets.PetType = p2.PetType
    );
    
    SELECT * FROM Pets;

    結果:

    PETID	PETNAME	PETTYPE
    1	Wag	Dog
    2	Scratch	Cat
    3	Tweet	Bird
    4	Bark	Dog

    前の例と同じ結果です。


    1. 子テーブル挿入のトリガーを作成すると、紛らわしいエラーが返されます

    2. 新しいRailsプロジェクトでSQLiteからPostgreSQLに変更する

    3. Rails:pggemのインストール中にエラーが発生しました

    4. 列にNULLが含まれるレコードを検索する方法