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

#6 Javier Loria\(MVP\)
03/07/2003 - 20:16 | Informe spam
Hola Federico:
Puedes identificar alguna columna o combinacion de columnas que deberia
convertirse en Llave Primaria?.
Quiero decir tienes alguna columnas o combinacion de columnas que no
debieran repetirse nunca y que no deban ser nulas?.
Porque la unica forma de evitar que siga pasando es con una llave
Primaria.

Si lo unico que te interesa es quitar los "Registros Repetidos" puedes
hacer:
/* Pseudo Codigo */
BEGIN TRAN
/* Equivalente al Distinct pero solo para los que tienen mas que 1 */
SELECT Columna1, Columna2, ...
INTO #Temporal
FROM MiTabla
GROUP BY Columna1, Columna2, ...
HAVING COUNT(*)>1

/* Elimina TODOS los REPETIDOS */
/* No es ANSI pero funciona mejor que ANSI :) */
DELETE MiTabla
FROM MiTabla JOIN #Temporal ON
MiTabla.Columna1=#Temporal.Columna1 AND
MiTabla.Columna2=#Temporal.Columna2 AND
.
/* Inserta los Repetidos una unica VEZ */
INSERT MiTabla(Columna1, Columna2, )
SELECT * FROM #Temporal

/* Borra la Tabla */
DROP TABLE #Temporal

COMMIT
/* Fin de Pseudo Codigo */

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.

"Federico François" wrote in message
news:uQi8%
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
#7 Liliana Sorrentino
03/07/2003 - 20:18 | Informe spam
Federico:
El operador UNION une el resultado de dos o más consultas, eliminando los
duplicados (a menos que uses UNION ALL que incluye los duplicados también).
Por eso me parece que puede serte útil.

SELECT *
INTO tabla_nueva -- deja los resultados en una nueva tabla
FROM tabla
UNION
SELECT * FROM tabla

Liliana.


"Federico François" escribió en el mensaje
news:uQi8#
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
#8 Liliana Sorrentino
03/07/2003 - 20:21 | Informe spam
Javier:
Gracias por el comentario del SET ROWCOUNT, no lo había visto antes.
Con respecto a la segunda observación, estoy totalmente de acuerdo, solo que
el caso de Federico es de FILAS iguales, eso simplifica la solución, a menos
que alguno de ustedes vea algún inconveniente que yo no.
Saludos...
Liliana.

"Javier Loria(MVP)" escribió en el mensaje
news:
Hola Isaias:
Hasta que lei el correo de Lilliana entendi tu procedimiento, me habia
saltado el SET ROWCOUNT.
Un par de comentarios:
1) Yo me alejaria de el SET ROWCOUNT, ya que si lees con detenimiento los
BOL veras:
> Observaciones
Es recomendable que las instrucciones DELETE, INSERT y UPDATE que
actualmente utilizan SET ROWCOUNT se vuelvan a escribir con la sintaxis


TOP.
> El otro dia en otro foro alguien hizo mencion a esto, y tu que tienes
experiencia sabras que es una forma de MS de anunciar que es probable que


el
las proximas versiones no sera soportado.

2) Normalmente cuando me ha tocado hacer uso de este tipo de sentencias no
es solo encontrar los duplicados el problema (o las llaves primarias)
duplicadas, sino tambien el "decidir" cual es el registro que te dejas (el
primero, el ultimo, el mas viejo, el mas nuevo, o haces una mezcla?), Si
vamos a construir una solucion esta debe contemplar la alternativa de


poder
seleccionar el registro deseado bajo algun criterio.


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.

"Javier Loria(MVP)" wrote in message
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.
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida