Bagaimana cara menemukan nilai duplikat dalam tabel di Oracle?

277

Apa pernyataan SQL paling sederhana yang akan mengembalikan nilai duplikat untuk kolom tertentu dan jumlah kemunculannya dalam tabel database Oracle?

Sebagai contoh: Saya punya JOBStabel dengan kolom JOB_NUMBER. Bagaimana saya bisa mengetahui jika saya memiliki duplikat JOB_NUMBER, dan berapa kali mereka digandakan?

Andrew
sumber

Jawaban:

610
SELECT column_name, COUNT(column_name)
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) > 1;
Bill the Lizard
sumber
1
Terima kasih - itulah jawaban yang baru saya temukan dan Anda mengalahkan saya untuk mengirimnya kembali ke sini! : o)
Andrew
3
Sama-sama. Sekarang saya akan memposting pertanyaan saya sendiri tentang perbedaan antara jumlah (kolom) dan jumlah (*). :)
Bill the Lizard
44
+1 lebih dari 4 tahun kemudian, masih berfungsi dengan baik, dan dapat disesuaikan untuk memilih beberapa kolom selama kolom tersebut juga ada group by, seperti dalam: select column_one, column_two, count(*) from tablename group by column_one, column_two having count(column_one) > 1;dll.
Amos M. Carpenter
4
atau bahkan having count(*) > 1: D
Stanislav Mamontov
3
+1 lebih dari 8 tahun kemudian, masih berfungsi dengan baik untuk versi terbaru dari Oracle dan MySQL (hapus spasi setelah fungsi hitung dalam saluran).
PhatHV
58

Cara lain:

SELECT *
FROM TABLE A
WHERE EXISTS (
  SELECT 1 FROM TABLE
  WHERE COLUMN_NAME = A.COLUMN_NAME
  AND ROWID < A.ROWID
)

Bekerja dengan baik (cukup cepat) ketika ada indeks aktif column_name. Dan itu cara yang lebih baik untuk menghapus atau memperbarui baris duplikat.

Grrey
sumber
3
+1 berfungsi dengan baik untuk duplikat multi-kolom (mis. Ketika Anda ingin menambahkan batasan UNIQUE pada beberapa kolom), saya menemukan pendekatan ini kurang "kaku" daripada GROUP BY satu untuk mendaftar nilai bidang duplikat + bidang lain jika perlu.
Frosty Z
3
Hanya untuk memperjelas, (ini tidak jelas bagi saya pada awalnya) permintaan ini hanya mengembalikan duplikat, itu tidak mengembalikan entri asli pertama, itulah sebabnya ia bekerja dengan baik untuk menghapus duplikat, berdasarkan kendala unik di lebih dari 1 kolom. Anda bisa memilih duplikat ID dengan kueri ini, dan kemudian menggunakannya untuk menghapus duplikat.
matthewb
1
jika Anda mengubah <to! = Anda akan mendapatkan semua catatan yang duplikat. bukan hanya rekor ke-2 atau ke-3
moore1emu
33

Paling sederhana yang bisa saya pikirkan:

select job_number, count(*)
from jobs
group by job_number
having count(*) > 1;
JosephStyons
sumber
1
Bagaimana saya bisa mendapatkan semua kolom?
Asif Mushtaq
2
pilih * dari pekerjaan di mana job_number masuk (pilih job_number dari grup pekerjaan oleh job_number yang dihitung (*)> 1)
JosephStyons
17

Anda bahkan tidak perlu menghitung di kolom yang dikembalikan jika Anda tidak perlu tahu jumlah duplikat yang sebenarnya. misalnya

SELECT column_name
FROM table
GROUP BY column_name
HAVING COUNT(*) > 1
Evan
sumber
7

Bagaimana tentang:

SELECT <column>, count(*)
FROM <table>
GROUP BY <column> HAVING COUNT(*) > 1;

Untuk menjawab contoh di atas, akan terlihat seperti:

SELECT job_number, count(*)
FROM jobs
GROUP BY job_number HAVING COUNT(*) > 1;
Andrew
sumber
5

Jika beberapa kolom mengidentifikasi baris unik (mis. Tabel relasi) di sana Anda dapat menggunakan yang berikut

Gunakan id baris mis. Emp_dept (empid, deptid, startdate, enddate) anggaplah empid dan deptid adalah unik dan mengidentifikasi baris dalam kasus itu

select oed.empid, count(oed.empid) 
from emp_dept oed 
where exists ( select * 
               from  emp_dept ied 
                where oed.rowid <> ied.rowid and 
                       ied.empid = oed.empid and 
                      ied.deptid = oed.deptid )  
        group by oed.empid having count(oed.empid) > 1 order by count(oed.empid);

dan jika tabel tersebut memiliki kunci utama maka gunakan kunci utama alih-alih rowid, mis. id adalah pk lalu

select oed.empid, count(oed.empid) 
from emp_dept oed 
where exists ( select * 
               from  emp_dept ied 
                where oed.id <> ied.id and 
                       ied.empid = oed.empid and 
                      ied.deptid = oed.deptid )  
        group by oed.empid having count(oed.empid) > 1 order by count(oed.empid);
Jitendra Vispute
sumber
4

Perbuatan

select count(j1.job_number), j1.job_number, j1.id, j2.id
from   jobs j1 join jobs j2 on (j1.job_numer = j2.job_number)
where  j1.id != j2.id
group by j1.job_number

akan memberi Anda id baris yang digandakan.

agnul
sumber
4
SELECT   SocialSecurity_Number, Count(*) no_of_rows
FROM     SocialSecurity 
GROUP BY SocialSecurity_Number
HAVING   Count(*) > 1
Order by Count(*) desc 
Wahid Haidari
sumber
2

Saya biasanya menggunakan fungsi Oracle Analytic ROW_NUMBER () .

Katakanlah Anda ingin memeriksa duplikat anda mengenai indeks yang unik atau kunci utama dibangun pada kolom ( c1, c2, c3). Maka Anda akan pergi dengan cara ini, memunculkan ROWIDbaris di mana jumlah baris yang dibawa ROW_NUMBER()adalah >1:

Select * From Table_With_Duplicates
      Where Rowid In
                    (Select Rowid
                       From (Select Rowid,
                                    ROW_NUMBER() Over (
                                            Partition By c1 || c2 || c3
                                            Order By c1 || c2 || c3
                                        ) nbLines
                               From Table_With_Duplicates) t2
                      Where nbLines > 1)
J. Chomel
sumber
1

Berikut ini adalah permintaan SQL untuk melakukan itu:

select column_name, count(1)
from table
group by column_name
having count (column_name) > 1;
Chaminda Dilshan
sumber
1

Saya tahu ini adalah utas lama tapi ini bisa membantu seseorang.

Jika Anda perlu mencetak kolom lain dari tabel sambil memeriksa penggunaan duplikat di bawah ini:

select * from table where column_name in
(select ing.column_name from table ing group by ing.column_name having count(*) > 1)
order by column_name desc;

juga dapat menambahkan beberapa filter tambahan di klausa mana jika diperlukan.

Parth Kansara
sumber
0

1. solusi

select * from emp
    where rowid not in
    (select max(rowid) from emp group by empno);
Lakukan atau mati
sumber
Poster asli ini tidak pernah menyebutkan penghapusan, hanya menghitung
Jeff
-1

Anda juga dapat mencoba sesuatu seperti ini untuk mendaftar semua nilai duplikat dalam sebuah tabel katakan reqitem

SELECT count(poid) 
FROM poitem 
WHERE poid = 50 
AND rownum < any (SELECT count(*)  FROM poitem WHERE poid = 50) 
GROUP BY poid 
MINUS
SELECT count(poid) 
FROM poitem 
WHERE poid in (50)
GROUP BY poid 
HAVING count(poid) > 1;
Stacker
sumber