Borrar registros de SQL

03/07/2003 - 01:45 por Federico Francois | Informe spam
Mi consulta es la siguiente.
Tengo una base de datos con registros repetidos , ya que
no tiene ninguna clave principal.
Me gustaria borrar solamente los registros repetidos.
pero mi problema es el siguiente, si hogo "delete from
miTabla where registro = valor" , se me borran ambos
registros y mi idea es conservar solamente 1 de los
registros que se encuentra repetido.

Desde ya muchas gracias.

Preguntas similare

Leer las respuestas

#1 Javier Loria\(MVP\)
03/07/2003 - 02:04 | Informe spam
Hola Federico:
La forma mas facil (hay otras) es hacer un SELECT agrupado por el
cadidato de la llave Primaria, y con algun criterio de seleccion sobre las
demas columnas. Insertarlo en una tabla Temporal, borrar los datos y luego
Insertarlos. Algo como:
/* Pseudocodigo */
SELECT Columna1, MAX(Columna2), MIN(Columna3)
INTO #NuevaTabla
FROM MiTabla
GROUP BY Columna1

DELETE MiTabla

INSERT MiTabla
SELECT * FROM #NuevaTabla

DROP TABLE #NuevaTabla
/* Fin de Pseudocodigo */

Si no es una solucion razonable, vemos otras alternativas.


Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

"Federico Francois" wrote in message
news:0d2a01c340f3$fe8b52c0$
Mi consulta es la siguiente.
Tengo una base de datos con registros repetidos , ya que
no tiene ninguna clave principal.
Me gustaria borrar solamente los registros repetidos.
pero mi problema es el siguiente, si hogo "delete from
miTabla where registro = valor" , se me borran ambos
registros y mi idea es conservar solamente 1 de los
registros que se encuentra repetido.

Desde ya muchas gracias.

Respuesta Responder a este mensaje
#2 Isaías
03/07/2003 - 02:10 | Informe spam
Hola Javier

Seria un placer para mi, recibir un comentario sobre mi
solucion.

Saludos
Respuesta Responder a este mensaje
#3 Javier Loria\(MVP\)
03/07/2003 - 03:31 | Informe spam
Hola Isaias:
Comparto contigo lo de preguenta recurrente.
Una consulta sobre tu procedimiento, la sentencia:
DELETE MyTabla WHERE MyCol1 = @col1 and MyCol2 = @col2


No borra TODOS las Filas que tienen esa "Llave Primaria" ?
Aun cuando soy enemigo de los CURSORES este es un caso donde
consideraria seriamente usar uno, porque aun cuando el procedimiento que
envie es muy eficiente si hay muchas filas repetidas, en el caso que hay
miles o millones no repetidas y unas cuantas NO repetidas no debe ser muy
eficiente.
Una solucion alternativa es solo borrar los repetidos, haciendo el
INSERT, DELETE e INSERT solo para los que tienen COUNT(*)>1

Saludos,


Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
"Isaías" wrote in message
news:043901c340f7$1a277880$
Para los MVP, esta pregunta es RECURRENTE, deberiamos
incluirla en las Preguntas Comunes.

Suponiendo que los duplicados se identifiquen por 2
columnas, la solucion es:

por Col1 y Col2
DECLARE @col1 SMALLINT, @col2 INT, @dupcnt INT
declare dups cursor for
SELECT MyCol1, MyCol2, (count(*) - 1) as Duplicates
FROM MyTabla
GROUP BY MyCol1, Mycol2
HAVING count(*) > 1 order by MyCol1, MyCol2

OPEN dups
WHILE(1=1)
BEGIN
FETCH NEXT FROM dups INTO @col1, @col2, @dupcnt
IF (@@fetch_status < 0)
BREAK -- Rompo el Ciclo
SET rowcount @dupcnt
DELETE MyTabla WHERE MyCol1 = @col1 and MyCol2 = @col2
END
DEALLOCATE dups

Si los DUPLICADOS son identificados por menos o mas
columnas, alterar el codigo.

Saludos.
Respuesta Responder a este mensaje
#4 Liliana Sorrentino
03/07/2003 - 16:16 | Informe spam
Si me permiten, me parece entender en el mensaje de Federico que tiene
"registros duplicados", y me imagino registros completos, no solo "claves
duplicadas".
En la solución de Isaías (sabés que odio los CURSORES Isaías) no borra TODAS
las filas, deja una, por lo de:
SELECT MyCol1, MyCol2, (count(*) - 1) as Duplicates (muy astuto)

¿Qué tal un...

select *
into #test_nuevo
from #test
union
select * from #test

Si comparo esto con la opción del CURSOR, el costo no solo es más bajo, sino
que disminuye considerablemente cuantos más repetidos hay.
Solo como opción. Federico tendrá la última palabra.
Saludos... Liliana.


"Javier Loria(MVP)" escribió en el mensaje
news:#
Hola Isaias:
Comparto contigo lo de preguenta recurrente.
Una consulta sobre tu procedimiento, la sentencia:
> DELETE MyTabla WHERE MyCol1 = @col1 and MyCol2 = @col2
No borra TODOS las Filas que tienen esa "Llave Primaria" ?
Aun cuando soy enemigo de los CURSORES este es un caso donde
consideraria seriamente usar uno, porque aun cuando el procedimiento que
envie es muy eficiente si hay muchas filas repetidas, en el caso que hay
miles o millones no repetidas y unas cuantas NO repetidas no debe ser muy
eficiente.
Una solucion alternativa es solo borrar los repetidos, haciendo el
INSERT, DELETE e INSERT solo para los que tienen COUNT(*)>1

Saludos,


Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
"Isaías" wrote in message
news:043901c340f7$1a277880$
> Para los MVP, esta pregunta es RECURRENTE, deberiamos
> incluirla en las Preguntas Comunes.
>
> Suponiendo que los duplicados se identifiquen por 2
> columnas, la solucion es:
>
> por Col1 y Col2
> DECLARE @col1 SMALLINT, @col2 INT, @dupcnt INT
> declare dups cursor for
> SELECT MyCol1, MyCol2, (count(*) - 1) as Duplicates
> FROM MyTabla
> GROUP BY MyCol1, Mycol2
> HAVING count(*) > 1 order by MyCol1, MyCol2
>
> OPEN dups
> WHILE(1=1)
> BEGIN
> FETCH NEXT FROM dups INTO @col1, @col2, @dupcnt
> IF (@@fetch_status < 0)
> BREAK -- Rompo el Ciclo
> SET rowcount @dupcnt
> DELETE MyTabla WHERE MyCol1 = @col1 and MyCol2 = @col2
> END
> DEALLOCATE dups
>
> Si los DUPLICADOS son identificados por menos o mas
> columnas, alterar el codigo.
>
> Saludos.


Respuesta Responder a este mensaje
#5 Federico François
03/07/2003 - 19:33 | Informe spam
Mi problema se asemeja al que Liliana comenta. Los campos no tienen niniguna
clave principa y estan identicamente repetidos. Y al estar repetidos me
aparecen mas de una vez en las consultas , hacer un select distinct es una
solucion para mi a la hora de mostrar los datos , pero los datos que tengo
duplicados ocupan un lugar muy valioso en la base de datos , y ademas me
enlentecen el retorno de datos.
Solo me quiero quedar con un ejemplar , en caso que esten repetidos .

Si hago un Select * from mi tabla , este me devuelve 15000 registros
en cambio
Si hago un Select distinct from mi tabla , este me devuelve 13000
registros

a lo que deduzco que hay 2000 repetidos que quiero remover

Muchas gracias





"Liliana Sorrentino" escribió en el mensaje
news:
Si me permiten, me parece entender en el mensaje de Federico que tiene
"registros duplicados", y me imagino registros completos, no solo "claves
duplicadas".
En la solución de Isaías (sabés que odio los CURSORES Isaías) no borra


TODAS
las filas, deja una, por lo de:
SELECT MyCol1, MyCol2, (count(*) - 1) as Duplicates (muy astuto)

¿Qué tal un...

select *
into #test_nuevo
from #test
union
select * from #test

Si comparo esto con la opción del CURSOR, el costo no solo es más bajo,


sino
que disminuye considerablemente cuantos más repetidos hay.
Solo como opción. Federico tendrá la última palabra.
Saludos... Liliana.


"Javier Loria(MVP)" escribió en el mensaje
news:#
> Hola Isaias:
> Comparto contigo lo de preguenta recurrente.
> Una consulta sobre tu procedimiento, la sentencia:
> > DELETE MyTabla WHERE MyCol1 = @col1 and MyCol2 = @col2
> No borra TODOS las Filas que tienen esa "Llave Primaria" ?
> Aun cuando soy enemigo de los CURSORES este es un caso donde
> consideraria seriamente usar uno, porque aun cuando el procedimiento que
> envie es muy eficiente si hay muchas filas repetidas, en el caso que hay
> miles o millones no repetidas y unas cuantas NO repetidas no debe ser


muy
> eficiente.
> Una solucion alternativa es solo borrar los repetidos, haciendo el
> INSERT, DELETE e INSERT solo para los que tienen COUNT(*)>1
>
> Saludos,
>
>
> Javier Loria
> Costa Rica (MVP)
> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> que pueda ser copiado y pegado al Query Analizer.
> La version de SQL y Service Pack tambien ayuda.
> "Isaías" wrote in message
> news:043901c340f7$1a277880$
> > Para los MVP, esta pregunta es RECURRENTE, deberiamos
> > incluirla en las Preguntas Comunes.
> >
> > Suponiendo que los duplicados se identifiquen por 2
> > columnas, la solucion es:
> >
> > por Col1 y Col2
> > DECLARE @col1 SMALLINT, @col2 INT, @dupcnt INT
> > declare dups cursor for
> > SELECT MyCol1, MyCol2, (count(*) - 1) as Duplicates
> > FROM MyTabla
> > GROUP BY MyCol1, Mycol2
> > HAVING count(*) > 1 order by MyCol1, MyCol2
> >
> > OPEN dups
> > WHILE(1=1)
> > BEGIN
> > FETCH NEXT FROM dups INTO @col1, @col2, @dupcnt
> > IF (@@fetch_status < 0)
> > BREAK -- Rompo el Ciclo
> > SET rowcount @dupcnt
> > DELETE MyTabla WHERE MyCol1 = @col1 and MyCol2 = @col2
> > END
> > DEALLOCATE dups
> >
> > Si los DUPLICADOS son identificados por menos o mas
> > columnas, alterar el codigo.
> >
> > Saludos.
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida