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.