次のオプションを使用して、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つのオプションは次のとおりです。
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
を持つ可能性があることに注意してください。 。
テーブルが元のデータ(重複行を含む)で復元されたと仮定すると、重複行を削除するための別のオプションがあります。
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
前の例と同じ結果です。