Problema:
Tiene filas duplicadas en su tabla, y solo las ID son únicas. ¿Cómo encuentras esas entradas duplicadas?
Ejemplo:
Nuestra base de datos tiene una tabla llamada product
con datos en las siguientes columnas:id
, name
y category
.
id | nombre | categoría |
---|---|---|
1 | bistec | carne |
2 | pastel | dulces |
3 | d>bistec | carne |
4 | cerdo | carne |
5 | pastel | dulces |
6 | pastel | dulces |
Encontremos nombres duplicados y categorías de productos. Puede encontrar duplicados agrupando filas, usando el COUNT
función agregada y especificando un HAVING
cláusula con la que filtrar filas.
Solución:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
Esta consulta devuelve solo registros duplicados, aquellos que tienen el mismo nombre de producto y categoría:
nombre | categoría |
---|---|
bistec | carne |
pastel | dulces |
Hay dos productos duplicados en nuestra mesa:bistec de la categoría de carnes y pastel de la categoría de dulces. El primer producto se repite dos veces en la tabla, mientras que el segundo aparece tres veces.
Discusión:
Para seleccionar valores duplicados, debe crear grupos de filas con los mismos valores y luego seleccionar los grupos con recuentos superiores a uno. Puede lograrlo usando GROUP BY
y un HAVING
cláusula.
El primer paso es crear grupos de registros con los mismos valores en todas las columnas sin ID (en nuestro ejemplo, name
y category
). Haces esto con un GROUP BY
cláusula. Después de GROUP BY
palabra clave, pones los nombres de las columnas que quieres usar para agrupar. Excluimos el id
columna porque es la clave principal de nuestra tabla; por definición, cada fila tendrá un valor diferente debajo de esa columna. Si lo incluyéramos, ¡entonces no podríamos detectar duplicados!
Queremos encontrar grupos con más de una fila; dichos grupos deben contener un duplicado por definición, siempre que los hayamos agrupado en las columnas correctas. Para hacer esto, usamos un HAVING
cláusula. La condición que especificamos es que el número de elementos en el grupo—COUNT(id)
—debe ser mayor que uno:COUNT(id) > 1
. Recuerda que HAVING
le permite filtrar grupos; WHERE
es para filtrar filas individuales.