reemplazar registros duplicados

25/02/2004 - 15:06 por Ariel Gimenez | Informe spam
Buenas,
La verdad que ya no se como resolver el siguiente problema, adjunto un
script para que se entienda mejor ...
y de antemano agradezco su tiempo por adelantado.
Tengo una tabla con addresses en esta tengo registros duplicados que hay que
borrar,
el criterio para ver si estan duplicados es por idoutlet+address+speciality,
(el idaddress es unico en esta tabla)
Bien ahora tengo otra tabla relacionada donde se guardan registros que
incluyen el campo idaddress y esta bien
que aparezcan duplicados, el tema es que antes de borrar el registro de la
tabla de addresses tengo que hacer
un update cambiando el idaddress que voy a borrar por el que me voy a dejar,
en esta segunda tabla.
Aca abajo te paso un ejemplito practico a ver si se entiende mejor...

drop table #aprocesar
drop table #noborrar
drop table #target
drop table #aborrar

/*tabla con registros a procesar duplicados la de addresses*/
create table #aprocesar (idaddress int ,idoutlet int, address varchar( 15),
speciality varchar(3))
insert into #aprocesar values(1,54,'repetido grupo1', 'reu')
insert into #aprocesar values(2,45,'repetido grupo2', 'reu')
insert into #aprocesar values(3,45,'repetido grupo2','reu')
insert into #aprocesar values(4,54,'repetido grupo1','reu')
insert into #aprocesar values(5,54,'noborrar','reu')
insert into #aprocesar values(6,46,'noborrar','reu')
insert into #aprocesar values(7,54,'repetido grupo1','reu')
insert into #aprocesar values(8,54,'noborrar','pop')

/*tabla con registros a actualizar cambiando el idaddress borrado por el que
queda*/
create table #target (idaddress int ,cualquiercampo varchar(4))
insert into #target values(1,'hola')
insert into #target values(1,'hola')
insert into #target values(2,'hola')
insert into #target values(2,'hola')
insert into #target values(3,'hola')
insert into #target values(3,'hola')
insert into #target values(3,'hola')
insert into #target values(4,'hola')
insert into #target values(5,'hola')
insert into #target values(5,'hola')
insert into #target values(5,'hola')
insert into #target values(6,'hola')
insert into #target values(7,'hola')
insert into #target values(8,'hola')

/*
saco los que no hay que borrar, agarro el min de c/grupo repetido
considero repetidos por la clave address+idoutlet+speciality
*/
select min(idaddress) idaddress, idoutlet, address, speciality
into #noborrar
from #aprocesar
group by idoutlet, address, speciality
having count(*)>=1

/*saco los que hay que borrar*/
select idaddress, idoutlet, address, speciality
into #aborrar
from #aprocesar
where idaddress not in (select idaddress from #noborrar)

/*a ver...*/
select * from #aprocesar
select * from #noborrar
select * from #aborrar
select * from #target
/*
como voy a borrar registros de la tabla addresses debo actualizar los id de
la
esta otra tabla (#target) poniendoles el id que elegi cuando hice el select
de #noborrar
*/

actualizar y
 

Leer las respuestas

#1 Maximiliano D. A.
25/02/2004 - 15:10 | Informe spam
Hola!! te entiendo, pero si el ID va a cambiar por algun criterio que vos
estas poniendo, creo que no te va a quedar otra que tener una tabla
comparativa donde por ej diga:

Viejo_id, nuevo_id

y luego hacer los update correspondientes, porque lo que estas cambiando son
ID y estas tomando nuevos criterios verdad? como seleccionaras que Id dejar?

Bye


Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"Ariel Gimenez" escribió en el
mensaje news:OBfynf6%
Buenas,
La verdad que ya no se como resolver el siguiente problema, adjunto un
script para que se entienda mejor ...
y de antemano agradezco su tiempo por adelantado.
Tengo una tabla con addresses en esta tengo registros duplicados que hay


que
borrar,
el criterio para ver si estan duplicados es por


idoutlet+address+speciality,
(el idaddress es unico en esta tabla)
Bien ahora tengo otra tabla relacionada donde se guardan registros que
incluyen el campo idaddress y esta bien
que aparezcan duplicados, el tema es que antes de borrar el registro de la
tabla de addresses tengo que hacer
un update cambiando el idaddress que voy a borrar por el que me voy a


dejar,
en esta segunda tabla.
Aca abajo te paso un ejemplito practico a ver si se entiende mejor...

drop table #aprocesar
drop table #noborrar
drop table #target
drop table #aborrar

/*tabla con registros a procesar duplicados la de addresses*/
create table #aprocesar (idaddress int ,idoutlet int, address varchar(


15),
speciality varchar(3))
insert into #aprocesar values(1,54,'repetido grupo1', 'reu')
insert into #aprocesar values(2,45,'repetido grupo2', 'reu')
insert into #aprocesar values(3,45,'repetido grupo2','reu')
insert into #aprocesar values(4,54,'repetido grupo1','reu')
insert into #aprocesar values(5,54,'noborrar','reu')
insert into #aprocesar values(6,46,'noborrar','reu')
insert into #aprocesar values(7,54,'repetido grupo1','reu')
insert into #aprocesar values(8,54,'noborrar','pop')

/*tabla con registros a actualizar cambiando el idaddress borrado por el


que
queda*/
create table #target (idaddress int ,cualquiercampo varchar(4))
insert into #target values(1,'hola')
insert into #target values(1,'hola')
insert into #target values(2,'hola')
insert into #target values(2,'hola')
insert into #target values(3,'hola')
insert into #target values(3,'hola')
insert into #target values(3,'hola')
insert into #target values(4,'hola')
insert into #target values(5,'hola')
insert into #target values(5,'hola')
insert into #target values(5,'hola')
insert into #target values(6,'hola')
insert into #target values(7,'hola')
insert into #target values(8,'hola')

/*
saco los que no hay que borrar, agarro el min de c/grupo repetido
considero repetidos por la clave address+idoutlet+speciality
*/
select min(idaddress) idaddress, idoutlet, address, speciality
into #noborrar
from #aprocesar
group by idoutlet, address, speciality
having count(*)>=1

/*saco los que hay que borrar*/
select idaddress, idoutlet, address, speciality
into #aborrar
from #aprocesar
where idaddress not in (select idaddress from #noborrar)

/*a ver...*/
select * from #aprocesar
select * from #noborrar
select * from #aborrar
select * from #target
/*
como voy a borrar registros de la tabla addresses debo actualizar los id


de
la
esta otra tabla (#target) poniendoles el id que elegi cuando hice el


select
de #noborrar
*/



que
actualizar y







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.593 / Virus Database: 376 - Release Date: 21/02/2004

Preguntas similares