次のオプションを使用して、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つのオプションを以下に示します。
テーブルの重複排除を行う前に、次のクエリを使用して、削除される行を確認できます。
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
と呼ばれる特別な列があります。 、テーブル内のその行を一意に識別します。テーブルから明示的に削除されていない限り、これを各行の一意の識別子として使用できます。これにより、上記のクエリを作成できます。同じことが次の例にも当てはまります。
テーブルが元のデータ(重複する行を含む)で復元されたと仮定すると、重複を解除するための別のオプションがあります。
削除される行を確認します:
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
テーブルは重複排除されました。