Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

6 Cara Memilih Baris Duplikat di Oracle

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dapatkan ID catatan yang terakhir dimasukkan di Oracle db

  2. Apakah ada Cara untuk menggunakan Linq ke Oracle

  3. Oracle Trigger ORA-04098:pemicu tidak valid dan validasi ulang gagal

  4. Oracle - literal tidak cocok dengan kesalahan format string

  5. Bagaimana Cara Membuat Skema di Oracle Menggunakan SQL Developer?