Buscando duplicados con SQLServer
Hay una
manera muy simple para poder buscar duplicados en las tablas de SQLServer. Vamos
a trabajar con la función ROW_NUMBER el cual va a ser un valor calculado cuando
se ejecuta el query.
Primero vamos
a crear una tabla muy simple
CREATE TABLE person(id int identity primary key,
name nvarchar(200) not null,
lastName nvarchar(200) not null,
email nvarchar(200) not null)
Con esa simple
tabla vamos a ingresar algunos datos y luego a crear nuestro resultado para ver
si existen duplicados.
Vamos a
insertar los siguientes datos
INSERT INTO person(name, lastName, email) values('Oscar',' Arias','Oscar.
Arias@example.com');
INSERT INTO person(name, lastName, email) values('Cleto','González','Cleto.González@example.com');
INSERT INTO person(name, lastName, email) values('Ricardo','Jiménez','Ricardo.Jiménez@example.com');
INSERT INTO person(name, lastName, email) values('Jesús','Jiménez','Jesús.Jiménez@example.com');
INSERT INTO person(name, lastName, email) values('Juan','Mora','Juan.Mora@example.com');
INSERT INTO person(name, lastName, email) values('José Rafael','De Gallegos','José Rafael.De Gallegos@example.com');
INSERT INTO person(name, lastName, email) values('Bernardo','Soto','Bernardo.Soto@example.com');
INSERT INTO person(name, lastName, email) values('José María','Montealegre','José María.Montealegre@example.com');
INSERT INTO person(name, lastName, email) values('José Joaquín','Trejos','José Joaquín.Trejos@example.com');
INSERT INTO person(name, lastName, email) values('José María','Figueres','José María.Figueres@example.com');
INSERT INTO person(name, lastName, email) values('Rodrigo','Carazo','Rodrigo.Carazo@example.com');
INSERT INTO person(name, lastName, email) values('Luis Alberto','Monge','Luis Alberto.Monge@example.com');
INSERT INTO person(name, lastName, email) values('Mario ','Echandi','Mario
.Echandi@example.com');
INSERT INTO person(name, lastName, email) values('Otilio','Ulate','Otilio.Ulate@example.com');
INSERT INTO person(name, lastName, email) values('Teodoro','Picado','Teodoro.Picado@example.com');
INSERT INTO person(name, lastName, email) values('Rafael Ángel','Calderón','Rafael Ángel.Calderón@example.com');
INSERT INTO person(name, lastName, email) values('León','Cortés','León.Cortés@example.com');
INSERT INTO person(name, lastName, email) values('Julio','Acosta','Julio.Acosta@example.com');
INSERT INTO person(name, lastName, email) values('Braulio','Carrillo','Braulio.Carrillo@example.com');
INSERT INTO person(name, lastName, email) values('Manuel','Aguilar','Manuel.Aguilar@example.com');
INSERT INTO person(name, lastName, email) values('Francisco','Morazán','Francisco.Morazán@example.com');
INSERT INTO person(name, lastName, email) values('Francisco María','Oreamuno','Francisco María.Oreamuno@example.com');
INSERT INTO person(name, lastName, email) values('Daniel','Oduber','Daniel.Oduber@example.com');
INSERT INTO person(name, lastName, email) values('Juan Rafael','Mora','Juan Rafael.Mora@example.com');
INSERT INTO person(name, lastName, email) values('Bruno','Carranza','Bruno.Carranza@example.com');
INSERT INTO person(name, lastName, email) values('Tomás','Guardia','Tomás.Guardia@example.com');
INSERT INTO person(name, lastName, email) values('Aniceto','Esquivel','Aniceto.Esquivel@example.com');
INSERT INTO person(name, lastName, email) values('Vicente','Herrera','Vicente.Herrera@example.com');
INSERT INTO person(name, lastName, email) values('Próspero','Fernández','Próspero.Fernández@example.com');
INSERT INTO person(name, lastName, email) values('Carlos','Durán','Carlos.Durán@example.com');
INSERT INTO person(name, lastName, email) values('Rafael','Yglesias','Rafael.Yglesias@example.com');
INSERT INTO person(name, lastName, email) values('Ascensión','Esquivel','Ascensión.Esquivel@example.com');
INSERT INTO person(name, lastName, email) values('Alfredo','González','Alfredo.González@example.com');
INSERT INTO person(name, lastName, email) values('Federico','Tinoco','Federico.Tinoco@example.com');
INSERT INTO person(name, lastName, email) values('José','Figueres','José.Figueres@example.com');
Ahora vamos
crear algunos queries para buscar los duplicados.
Para poder
buscar duplicados vamos a utilizar la función partition que nos permite
particionar los datos por las columnas que requerimos. Por ejemplo, si queremos
ver si tenemos duplicados por nombre podemos hacer el siguiente query
select * from (
select row_number() over(partition by name order by name asc) as rowId, id, name,lastName, email from person
) temp where rowId >1
Como vemos
en el resultado tenemos un duplicado por el nombre José María. En este caso
como queríamos buscar si hay nombres duplicados creamos la partición por el
nombre y con esto se va generar el numero del row_number cualquier row que sea
mayor a 1 quiere decir que es un duplicado de los datos.
select * from (
select row_number() over(partition by lastName order by name asc) as rowId, id, name,lastName, email from person
) temp where rowId >1
Con este
otro ejemplo estamos buscando duplicados usando el apellido. Si existen apellidos
duplicados vamos a poder obtenerlos.
Como vemos
tenemos 5 duplicados.
select * from (
select row_number() over(partition by lastName, name order by name asc) as rowId, id, name,lastName, email from person
) temp where rowId >1
Ahora con
este ultimo query vamos a buscar duplicados con el nombre y el apellido. Si ejecutamos
el query nos damos cuanta que no hay duplicados con la combinación de nombre y
apellidos.
Etiquetas: BaseDatos
0 comentarios:
Publicar un comentario
Suscribirse a Enviar comentarios [Atom]
<< Inicio