Masalah:
Anda memiliki baris duplikat di tabel Anda, dengan hanya ID yang unik. Bagaimana Anda menemukan entri duplikat itu?
Contoh:
Basis data kami memiliki tabel bernama product dengan data pada kolom berikut:id , name , dan category .
| id | nama | kategori |
|---|---|---|
| 1 | steak | daging |
| 2 | kue | permen |
| 3 | d>steak | daging |
| 4 | babi | daging |
| 5 | kue | permen |
| 6 | kue | permen |
Mari temukan duplikat nama dan kategori produk. Anda dapat menemukan duplikat dengan mengelompokkan baris, menggunakan COUNT fungsi agregat, dan menentukan HAVING klausa yang digunakan untuk memfilter baris.
Solusi:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
Kueri ini hanya mengembalikan rekaman duplikat—rekaman yang memiliki nama dan kategori produk yang sama:
| nama | kategori |
|---|---|
| steak | daging |
| kue | permen |
Ada dua produk duplikat di meja kami:steak dari kategori daging dan kue dari kategori manisan. Produk pertama diulang dua kali dalam tabel, sedangkan yang kedua muncul tiga kali.
Diskusi:
Untuk memilih nilai duplikat, Anda perlu membuat grup baris dengan nilai yang sama, lalu memilih grup dengan jumlah lebih dari satu. Anda dapat mencapainya dengan menggunakan GROUP BY dan HAVING klausa.
Langkah pertama adalah membuat grup record dengan nilai yang sama di semua kolom non-ID (dalam contoh kita, name dan category ). Anda melakukan ini dengan GROUP BY ayat. Setelah GROUP BY kata kunci, Anda menempatkan nama kolom yang ingin Anda gunakan untuk pengelompokan. Kami mengecualikan id kolom karena ini adalah kunci utama tabel kami; menurut definisi, setiap baris akan memiliki nilai yang berbeda di bawah kolom itu. Jika kami menyertakannya, maka kami tidak akan dapat mendeteksi duplikat!
Kami ingin mencari grup dengan lebih dari satu baris; grup tersebut harus berisi duplikat menurut definisi, selama kami telah mengelompokkan pada kolom yang benar. Untuk melakukan ini, kami menggunakan HAVING ayat. Kondisi yang kita tentukan adalah jumlah elemen dalam grup—COUNT(id) —harus lebih besar dari satu:COUNT(id) > 1 . Ingat bahwa HAVING memungkinkan Anda untuk memfilter grup; WHERE adalah untuk memfilter baris individual.