Problema:
Hai righe duplicate nella tabella, con solo gli ID univoci. Come trovi quelle voci duplicate?
Esempio:
Il nostro database ha una tabella denominata product con i dati nelle seguenti colonne:id , name e category .
| id | categoria | |
|---|---|---|
| 1 | bistecca | carne |
| 2 | torta | dolci |
| 3 | d>bistecca | carne |
| 4 | carne di maiale | carne |
| 5 | torta | dolci |
| 6 | torta | dolci |
Troviamo nomi e categorie di prodotti duplicati. Puoi trovare i duplicati raggruppando le righe, utilizzando il COUNT funzione di aggregazione e specificando un HAVING clausola con cui filtrare le righe.
Soluzione:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
Questa query restituisce solo record duplicati, quelli che hanno lo stesso nome di prodotto e categoria:
| nome | categoria |
|---|---|
| bistecca | carne |
| torta | dolci |
Nella nostra tabella sono presenti due prodotti duplicati:bistecca della categoria carne e torta della categoria dolci. Il primo prodotto viene ripetuto due volte nella tabella, mentre il secondo compare tre volte.
Discussione:
Per selezionare valori duplicati, è necessario creare gruppi di righe con gli stessi valori e quindi selezionare i gruppi con conteggi maggiori di uno. Puoi ottenerlo usando GROUP BY e un HAVING clausola.
Il primo passaggio consiste nel creare gruppi di record con gli stessi valori in tutte le colonne non ID (nel nostro esempio, name e category ). Puoi farlo con un GROUP BY clausola. Dopo il GROUP BY parola chiave, inserisci i nomi delle colonne che desideri utilizzare per il raggruppamento. Escludiamo l'id colonna perché è la chiave primaria della nostra tabella; per definizione, ogni riga avrà un valore diverso sotto quella colonna. Se dovessimo includerlo, non saremmo in grado di rilevare duplicati!
Vogliamo trovare gruppi con più di una riga; tali gruppi devono contenere un duplicato per definizione, purché abbiamo raggruppato sulle colonne corrette. Per fare ciò, utilizziamo un HAVING clausola. La condizione che specifichiamo è che il numero di elementi nel gruppo—COUNT(id) —deve essere maggiore di uno:COUNT(id) > 1 . Ricorda che HAVING ti permette di filtrare i gruppi; WHERE serve per filtrare singole righe.