Script Sql para eliminar duplicados - Forum

Forum Navigation
You need to log in to create posts and topics.

Script Sql para eliminar duplicados

@rasl

Amigo, he intentado probar con un pequeño ejercicio implementar el script que me sugeriste para eliminar registros duplicados, partiendo como filtro el campo planilla que es numerico al ejecutarlo me da un error ya que dice que se espera una instruccion de sql inexistente ...

Te adjunto la carpeta que contiene el pub y la base que es minima ya que solo tiene 3 registros y dos estan duplicados a proposito para probar..., me darias una gran ayuda si puedes echarle un vistazo y ver que es lo que falta o esta mal.

WITH duplicados AS (
SELECT
id,
ROW_NUMBER() OVER (PARTITION BY planilla ORDER BY id) AS fila
FROM
usuarios
)
DELETE FROM usuarios
WHERE id IN (
SELECT id
FROM duplicados
WHERE fila > 1
)

Tambien intento hacer esto que me sugieres pero no logro dar con el comando y la sintax adecuada...
me podrias brindar un ejemplo sobre la base y pub adjunta?

para evitar que se te dupliquen en lo sucesivo deberias hacer:

If not exists (select 1 from usarios where planilla=@planilla)

insert into usuarios.......

Desde ya mil gracias!
Un cordial saludo

Uploaded files:
  • You need to login to have access to uploads.

Tu base de datos carece de ID, o sea no tiene identificador único de registro en la tabla datos, esta suele llamarse clave primaria, por lo que no se puede realizar la eliminación por medio de un comando directo SQL, porque el mismo motor no sabe cual registro eliminar...

De todas formas te doy el código para obtener la lista de planillas que están duplicadas

SELECT PLANILLA
FROM datos
GROUP BY PLANILLA, TITULAR, DOMICILIO
HAVING COUNT(*) > 1

Lo siguiente es que agregues un campo Autoincremental, que le de un número único a cada registro porque de otra forma, si se le dice al motor de base de datos que borre la Planilla 101, entonces, eliminara todos los registros 101. Pero al tener el ID único, entonces se puede ir jugando con subconsultas hasta eliminar el resto de registros dejando 1 solo.

 

Otra forma de solución es que armes un procedimiento que recorra la tabla buscando el registro duplicado, y deje intacto la primer coincidencia, y vaya borrando las siguientes usando un while

Estimado @alangonzalez91, primero que nada infinitamente agradecido por tu ayuda y por tu tiempo ya que te has tomado el trabajo de descargar y revisar la base con la que estaba experimentando.

Aprovecho tambien para agradecerte tu respuesta en los otros post que respondiste.

Ya voy a probar rearmando nuevamente la base y agregandole el id autoincremental como me sugieres.

La verdad que el comando dbpExecSQL me cuenta mucho encontrarle la vuela ya que no se SQL y recurriendo a la IA las sentencias que me da como resultado luego me dan error porque no interpretan correctamente el uso de este comando.

en este caso el comando aplicaria asi?

dbpExecSQL "pruebas" "SELECT PLANILLA|FROM datos|GROUP BY PLANILLA, TITULAR, DOMICILIO|HAVING COUNT(*) > 1" ""

esto funcionaria con el autoincremento, perfecto ya lo pruebo ahora me faltaria poder eliminar los duplicados encontrados....

Ese script SQL que te he dado solo muestra cuales planilla están duplicados, pero no elimina nada. A partir de la modificación de la tabla agregando el campo Autoincrementeal se puede armar un algoritmo o un comando SQL mas elaborado para eliminación.

Con respecto a la sentencia dbpexecsql, cuando coloques código quita las barras verticales | así:

dbpExecSQL "pruebas" "SELECT PLANILLA FROM datos GROUP BY PLANILLA, TITULAR, DOMICILIO HAVING COUNT(*) > 1" ""

Otra forma más sencilla de lidiar con registros duplicados seria capturarlos antes de que se agreguen en la tabla, osea, verificar si ya existe un registro con esas carateristicas... también usando un comando SQL

SELECT PLANILLA WHERE ( PLANILLA = '[textentry planilla]' AND TITULAR = '[textentry titular]' ) AND DOMICILIO = '[textentry domicilio]'

Y si el resultado del comando arroja registros quiere decir que efectivamente el usuario esta a punto de duplicar el registro y daría una advertencia o directamente bloquearía o saldría del proceso de agregado del registro.

Un abrazo!

 

@alangonzalez91 genial pero no tengo idea de como armar esa sentencia para que los elimine....
con relacion a lo que me envias la advertencia seria un error para poder capturar?

Hola @joferar333 , disculpa la demora pero estuve fuera de accion

El script que te pase para los duplicados anda bien en sql pero no en access, edite tu pub de ejemplo para que funcione en access.

Observa que le agregue un campo Id autonumerico a la tabla datos

 

espero aun te sea util

salu2

Uploaded files:
  • You need to login to have access to uploads.