Cuando tenemos registros repetidos o duplicados.
Los : : significa CONCATENAR en cadena de texto separado por comas.
Como la Data de las tablas esta Normalizada pues no hay Datos duplicados, entonces para el ejercicio ingresamos unos Datos para probar este tema.
insert into platzi.alumnos (id, nombre, apellido, email, colegiatura, fecha_incorporacion, carrera_id, tutor_id)
values (1001, 'Pamelina', null, '[email protected]', 4800, '2020-04-26 10:18:51', 12, 16);
SELECT *
FROM platzi.alumnos AS ou
WHERE (
SELECT COUNT (*)
FROM platzi.alumnos AS inr
WHERE ou.id = inr.id
) > 1;
SELECT (platzi.alumnos.*)::text, COUNT(*)
FROM platzi.alumnos
GROUP BY platzi.alumnos.*
HAVING COUNT(*) > 1;
Raramente nos encontraremos con un ID duplicado por que se usa auto_increment.
En los Alias puse ou (Out) tabla de afuera, y inr (Interior) tabla interna, para poder saber mejor cual tabla estoy usando.
Simplemente estamos filtrando los alumnos cuyo ID se encuentre más de una vez en la tabla.
Estamos convirtiendo todo el registro a un texto. Además, estamos obteniendo la suma de los registros, agrupada por todos los campos, de tal forma que los duplicados tengan su suma mayor a 1.
Es más común encontrar registros duplicados pero que tengan diferente ID, para este caso las consultas podrían ser así:
Seleccionamos alumnos duplicados con los mismos valores (Menos el ID).
GROUP BY
SELECT (
platzi.alumnos.nombre,
platzi.alumnos.apellido,
platzi.alumnos.email,
platzi.alumnos.colegiatura,
platzi.alumnos.fecha_incorporacion,
platzi.alumnos.carrera_id,
platzi.alumnos.tutor_id
)::text, COUNT(*)
FROM platzi.alumnos
GROUP BY platzi.alumnos.nombre,
platzi.alumnos.apellido,
platzi.alumnos.email,
platzi.alumnos.colegiatura,
platzi.alumnos.fecha_incorporacion,
platzi.alumnos.carrera_id,
platzi.alumnos.tutor_id
HAVING COUNT (*) > 1;
SUB-QUERY y WINDOW FUNCTION (Nueva Forma)
SELECT *
FROM (
SELECT id,
ROW_NUMBER() OVER(
PARTITION BY
nombre,
apellido,
email,
colegiatura,
fecha_incorporacion,
carrera_id,
tutor_id
ORDER BY id ASC
) AS row,
*
FROM platzi.alumnos
) AS duplicados
WHERE duplicados.row > 1;
row nos dice cuántas veces se repite el registro.row y que tenga el número de fila de la proyección (como hicimos antes en los otros ejercicios).row, en la Window Function OVER se usa la cláusula PARTITION BY y ORDER BY. Al indicar en PARTITION BY todos los campos, menos el id, se divide la tabla en particiones, dependiendo de los campos determinados.Eliminar los registros duplicados.
DELETE FROM platzi.alumnos
WHERE id IN (
SELECT id
FROM (
SELECT id,
ROW_NUMBER() OVER(
PARTITION BY
nombre,
apellido,
email,
colegiatura,
fecha_incorporacion,
carrera_id,
tutor_id
ORDER BY id ASC
) AS row
FROM platzi.alumnos
) AS duplicados
WHERE duplicados.row > 1
);
Usamos la última versión del Query que utiliza window function en un Sub-Query para resolver el problema.
Solo hay que darle una variación, solo necesitamos el ID; De la tabla alumnos Eliminar el id que está dentro de este arreglo.
Estamos usando la consulta anterior para obtener los registros duplicados, pero solo obteniendo los IDs, para usarlos como Set de opciones en el DELETE.