Contoh berikut mengembalikan baris duplikat dari tabel Oracle Database.
Contoh Data
Misalkan kita memiliki tabel dengan data berikut:
SELECT * FROM Pets;
Hasil:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog 4 Bark Dog 4 Bark Dog
Dua baris pertama adalah duplikat, seperti juga tiga baris terakhir. Dalam hal ini baris duplikat berisi nilai duplikat di semua kolom, termasuk kolom ID.
Opsi 1
Kita dapat menggunakan kueri berikut untuk melihat berapa banyak baris yang merupakan duplikat:
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
ORDER BY PetId;
Hasil:
PETID PETNAME PETTYPE Count 1 Wag Dog 2 2 Scratch Cat 1 3 Tweet Bird 1 4 Bark Dog 3
Kami mengelompokkan baris menurut semua kolom, dan mengembalikan jumlah baris setiap grup. Setiap baris dengan jumlah lebih dari 1 adalah duplikat.
Kita bisa mengurutkannya dengan cara hitung dalam urutan menurun, sehingga baris dengan duplikat terbanyak muncul lebih dulu:
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
ORDER BY Count(*) DESC;
Hasil:
PETID PETNAME PETTYPE Count 4 Bark Dog 3 1 Wag Dog 2 2 Scratch Cat 1 3 Tweet Bird 1
Opsi 2
Jika kita hanya ingin baris duplikat yang terdaftar, kita dapat menggunakan HAVING
klausa untuk mengembalikan hanya baris dengan hitungan lebih besar dari 1:
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
HAVING COUNT(*) > 1
ORDER BY COUNT(*) DESC;
Hasil:
PETID PETNAME PETTYPE Count 4 Bark Dog 3 1 Wag Dog 2
Opsi 3
Opsi lainnya adalah menggunakan ROW_NUMBER()
fungsi jendela:
SELECT
PetId,
PetName,
PetType,
ROW_NUMBER() OVER (
PARTITION BY PetId, PetName, PetType
ORDER BY PetId, PetName, PetType
) AS rn
FROM Pets;
Hasil:
PETID PETNAME PETTYPE RN 1 Wag Dog 1 1 Wag Dog 2 2 Scratch Cat 1 3 Tweet Bird 1 4 Bark Dog 1 4 Bark Dog 2 4 Bark Dog 3
PARTITION BY
klausa membagi set hasil yang dihasilkan oleh FROM
klausa ke dalam partisi tempat fungsi diterapkan. Saat kita menentukan partisi untuk kumpulan hasil, setiap partisi menyebabkan penomoran dimulai dari awal lagi (yaitu penomoran akan dimulai dari 1 untuk baris pertama di setiap partisi).
Opsi 4
Kita dapat menggunakan kueri di atas sebagai ekspresi tabel umum:
WITH cte AS
(
SELECT
PetId,
PetName,
PetType,
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;
Hasil:
PETID PETNAME PETTYPE ROW_NUMBER 1 Wag Dog 2 4 Bark Dog 2 4 Bark Dog 3
Ini mengembalikan hanya kelebihan baris dari duplikat yang cocok. Jadi jika ada dua baris yang identik, ia mengembalikan salah satunya. Jika ada tiga baris yang identik, ia mengembalikan dua, dan seterusnya.
Opsi 5
Mengingat tabel kami tidak berisi kolom kunci utama, kami dapat memanfaatkan rowid
Oracle kolom semu:
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
);
Hasil:
PETID PETNAME PETTYPE 1 Wag Dog 4 Bark Dog 4 Bark Dog
Cara kerjanya adalah, setiap baris dalam database Oracle memiliki rowid
pseudocolumn yang mengembalikan alamat baris. rowid
adalah pengidentifikasi unik untuk baris dalam tabel, dan biasanya nilainya secara unik mengidentifikasi baris dalam database. Namun, penting untuk dicatat bahwa baris dalam tabel berbeda yang disimpan bersama dalam cluster yang sama dapat memiliki rowid
yang sama. .
Salah satu manfaat dari contoh di atas adalah kita dapat mengganti SELECT *
dengan DELETE
untuk menghilangkan penipuan tabel.
Opsi 6
Dan akhirnya, inilah opsi lain yang menggunakan rowid
kolom semu:
SELECT * FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
Hasil:
PETID PETNAME PETTYPE 1 Wag Dog 4 Bark Dog 4 Bark Dog
Hasil yang sama seperti contoh sebelumnya.
Seperti contoh sebelumnya, kita dapat mengganti SELECT *
dengan DELETE
untuk menghapus baris duplikat dari tabel.