Translate

Translate

jueves, 22 de enero de 2015

Tips SQL Server-Registros duplicados con N campos iguales

A continuación viene un articulo creado por un amigo de acuerdo a su experiencia laboral, agradezco el aporte al Ing. Héctor Calla. De paso espero sus comentarios :)




Hola que tal, en esta oportunidad voy a mostrarle un tip interesante para encontrar registros duplicados con 1, 2, 3, etc. campos iguales.
Bueno partamos del escenario siguiente tengo una tabla cliente y registro los clientes de acuerdo a la siguiente estructura:
CLIENTE
Código (PK)
nombre
dni
email
Como mi campo código es la llave primaria (PK) de la tabla cliente y por lo tanto no aceptará duplicados, ya que al ingresar un código duplicado mostrara un mensaje de violación de la llave primaria.
Pero qué pasa si registro 2, 3, 4, 5, N clientes con el mismo DNI (me ha pasado alguna vez en algunas empresas donde existen base de datos que tienen tablas que permiten registrar este escenario y que quizá a los programadores se les paso hacer alguna validación extra para evitar ingresar clientes con el mismo DNI o RUC), bueno entonces podemos usar la siguiente instrucción  SQL para detectar aquellos clientes que tienen el mismo DNI:
SELECT dni, COUNT(*) as duplicados
FROM CLIENTE
GROUP BY dni
HAVING COUNT(*) > 1
Mostrandonos como resultado:

Entonces concluyendo podemos decir que si queremos comparar varios campos esta sería la consulta general:
SELECT CAMPO_1, CAMPO2_, CAMPO_3, ..., CAMPO_N, COUNT(*)
FROM TABLA
GROUP BY CAMPO_1, CAMPO2_, CAMPO_3, ..., CAMPO_N
HAVING COUNT(*) > 1

Espero les sirva de utilidad, les dejo el codigo de ejemplo para que lo prueben en sus pc’s:

CREATE TABLE CLIENTE
(
      codigo char(6) PRIMARY KEY,
      nombre varchar(50) NULL,
      dni char(8) NULL,
      email varchar(50) NULL,
)
GO

INSERT INTO CLIENTE VALUES('000001', 'LUIS FERNANDEZ', '12345678', 'user@hotmail.com')
INSERT INTO CLIENTE VALUES('000002', 'DANIEL CONTRERAS', '11223344', 'user2@hotmail.com')
INSERT INTO CLIENTE VALUES('000003', 'MARIA GONZALES', '12345678', 'user3@hotmail.com')
INSERT INTO CLIENTE VALUES('000004', 'VICTORIA RENGIFO', '12312312', 'user4@hotmail.com')

PD: El código debería funcionar para oracle, mysql, sql server, postgresql.

Ing. Héctor Calla, egresado de la UNMSM, actualmente llevando una maestría en Ingeniería de Software en la PUCP y dedicado al desarrollo de sistemas comerciales usando Power Builder, C#, con base de datos SQL Server, Postgresql, MySQL. 

No hay comentarios:

Publicar un comentario