borrar duplicados

30/01/2006 - 19:40 por Mauro | Informe spam
por un problema en una aplicacion se duplicaron las entradas en una tabla
que no tiene clave primaria.
aunque identifico cuales son los registros duplicados, no se me ocurre como
puedo hacer para borrarlos , ya que no
cuento con un identificador unico,
como puedo hacerlo, teneindo en cuenta que las filas son identicas para
borrar uno de los 2 registros y asi dejar la base consistente.

saludos
Mauro.

Preguntas similare

Leer las respuestas

#1 Isaias
30/01/2006 - 20:34 | Informe spam
Mauro

Analiza este script, si tienes dudas, pregunta:

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
SET ROWCOUNT 0
Saludos
IIslas


"Mauro" escribió:

por un problema en una aplicacion se duplicaron las entradas en una tabla
que no tiene clave primaria.
aunque identifico cuales son los registros duplicados, no se me ocurre como
puedo hacer para borrarlos , ya que no
cuento con un identificador unico,
como puedo hacerlo, teneindo en cuenta que las filas son identicas para
borrar uno de los 2 registros y asi dejar la base consistente.

saludos
Mauro.



Respuesta Responder a este mensaje
#2 Alejandro Mesa
30/01/2006 - 21:01 | Informe spam
Mauro,

Adiciona un identificador unico, elimina los duplicados y luego eliminas el
identificador.

Ejemplo:

alter table t1
add c1 int not null identity(1, 1)
go

create unique nonclustered index t1_c1_u_nc_idx
on t1 (c1 asc)
go

delete t1
where exists(
select *
from t1 as t2
where
t2.c_a = t1.c_a
t2.c_b = t1.c_b
...
t2.c_n = t1.c_n
and t2.c1 < t1.c1
)

drop index t1_c1_u_nc_idx
go

alter table t1
drop column c1
go


AMB

"Mauro" wrote:

por un problema en una aplicacion se duplicaron las entradas en una tabla
que no tiene clave primaria.
aunque identifico cuales son los registros duplicados, no se me ocurre como
puedo hacer para borrarlos , ya que no
cuento con un identificador unico,
como puedo hacerlo, teneindo en cuenta que las filas son identicas para
borrar uno de los 2 registros y asi dejar la base consistente.

saludos
Mauro.



Respuesta Responder a este mensaje
#3 Mauro
30/01/2006 - 21:09 | Informe spam
buenisimo, no conocia la propiedad set rowcount
muchas gracias!!!

saludos
mauro


"Isaias" wrote in message
news:
Mauro

Analiza este script, si tienes dudas, pregunta:

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
SET ROWCOUNT 0
Saludos
IIslas


"Mauro" escribió:

> por un problema en una aplicacion se duplicaron las entradas en una


tabla
> que no tiene clave primaria.
> aunque identifico cuales son los registros duplicados, no se me ocurre


como
> puedo hacer para borrarlos , ya que no
> cuento con un identificador unico,
> como puedo hacerlo, teneindo en cuenta que las filas son identicas para
> borrar uno de los 2 registros y asi dejar la base consistente.
>
> saludos
> Mauro.
>
>
>
Respuesta Responder a este mensaje
#4 Alejandro Mesa
30/01/2006 - 22:29 | Informe spam
cali,

Mucho cuidado con el filtro que usas en la clausula "where" de la sentencia
"delete" porque si no agregas las columnas por las cuales detectas la
duplicacion, terminaras quedandote con una unica fila (el primer valor
identity) en esa tabla.


AMB

"cali" wrote:

bien ahi alejandro.te me anticipaste jajajaja
"cali" wrote in message news:%23$
esto es mas opytimo
crea un campom identity en tu tabla
y corre este script

delete tabla
where exists(
select *
from tabla as a
where a.c3 > tabla.c3
)
c3 es el campo identity

"Mauro" wrote in message news:%
por un problema en una aplicacion se duplicaron las entradas en una tabla
que no tiene clave primaria.
aunque identifico cuales son los registros duplicados, no se me ocurre como
puedo hacer para borrarlos , ya que no
cuento con un identificador unico,
como puedo hacerlo, teneindo en cuenta que las filas son identicas para
borrar uno de los 2 registros y asi dejar la base consistente.

saludos
Mauro
Respuesta Responder a este mensaje
#5 Mauro
31/01/2006 - 14:39 | Informe spam
ya entiendo el script, ahora, me resulto mas rapido crear un tabla con los
datos a borrar/preservar, y luego usar esa tabla en el where
ej:
esto demora 1.57 min

select myid, COUNT(myid) cant, min(id) minid into table_a --50 seg
FROM bup WITH (NOLOCK)
where starttime between '20051001' and '20051028'
group by myid having COUNT(myid)>1
order by myid

begin tran
delete from bup where id not in (select minid from table_a) --1.07
and myid in (select myid from table_a)
rollback tran

y esto demora 2.36 min

begin tran2.36min
delete bup
where starttime between '20051001' and '20051028'
and exists(
select *
from bup as t2
where
starttime between '20051001' and '20051028'
and t2.myid = bup.myid
and t2.id < bup.id
)
rollback tran


"Alejandro Mesa" wrote in message
news:
Mauro,

Adiciona un identificador unico, elimina los duplicados y luego eliminas


el
identificador.

Ejemplo:

alter table t1
add c1 int not null identity(1, 1)
go

create unique nonclustered index t1_c1_u_nc_idx
on t1 (c1 asc)
go

delete t1
where exists(
select *
from t1 as t2
where
t2.c_a = t1.c_a
t2.c_b = t1.c_b
...
t2.c_n = t1.c_n
and t2.c1 < t1.c1
)

drop index t1_c1_u_nc_idx
go

alter table t1
drop column c1
go


AMB

"Mauro" wrote:

> por un problema en una aplicacion se duplicaron las entradas en una


tabla
> que no tiene clave primaria.
> aunque identifico cuales son los registros duplicados, no se me ocurre


como
> puedo hacer para borrarlos , ya que no
> cuento con un identificador unico,
> como puedo hacerlo, teneindo en cuenta que las filas son identicas para
> borrar uno de los 2 registros y asi dejar la base consistente.
>
> saludos
> Mauro.
>
>
>
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida