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

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

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

    これらの例では、重複する行を削除しますが、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

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

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

    結果:

    PetId  PetName  PetType
    -----  -------  -------
    1      Wag      Dog    
    4      Bark     Dog    
    4      Bark     Dog    

    これは、次のステップでテーブルの重複排除を行うときに3つの行が削除されることを示しています。

    重複する値を削除するには、SELECT *を置き換えて上記のクエリを変更します。 DELETEを使用 :

    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;

    結果:

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

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

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

    これができた理由は、SQLiteのrowidが原因です。 。 デフォルトでは、SQLiteのすべての行には、通常rowidと呼ばれる特別な列があります。 、テーブル内のその行を一意に識別します。テーブルから明示的に削除されていない限り、これを各行の一意の識別子として使用できます。これにより、上記のクエリを作成できます。同じことが次の例にも当てはまります。

    オプション2

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

    削除される行を確認します:

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

    結果:

    PetId  PetName  PetType
    -----  -------  -------
    1      Wag      Dog    
    4      Bark     Dog    
    4      Bark     Dog    

    次に、これらの行を削除します:

    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. SQLのビューにパラメーターを渡すことはできますか?

    2. アプリケーションユーザーと行レベルのセキュリティ

    3. OracleのCONNECTBY... START WITHと同等のPostgreSQL構文は何ですか?

    4. セグメントに障害が発生することなく、Ruby1.8.7を搭載したOSX Lionでgemインストールを機能させるにはどうすればよいですか?