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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 Ariel Gimenez
25/02/2004 - 15:46 | Informe spam
Gracias Maximiliano!
Si tenes razon en lo que me decis, entendiste perfectamente,
yo cuando saco los que hay que borrar lo hago de la siguiente manera:

select min(idaddress) idaddress, idoutlet, address, speciality
into #noborrar
from #aprocesar
group by idoutlet, address, speciality
having count(*)>=1

entonces agarro siempre el que tiene el id mas bajo, lo de la tabla con
nuevo
y viejo la verdad que lo intente pero no se como identificar cual es cual,
es mas creo que en un rato mas no voy a saber ni quien soy yo :(

-
Ariel Gimenez
-
"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> wrote in message
news:O6nHCm6%
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


Respuesta Responder a este mensaje
#3 Ariel Gimenez
25/02/2004 - 16:41 | Informe spam
Alguien me puede dar una mano para implementar lo de la tablita de nuevo y
viejo que me recomienda Maxi?

graciasss
"Ariel Gimenez" wrote in message
news:eegG216%
Gracias Maximiliano!
Si tenes razon en lo que me decis, entendiste perfectamente,
yo cuando saco los que hay que borrar lo hago de la siguiente manera:

select min(idaddress) idaddress, idoutlet, address, speciality
into #noborrar
from #aprocesar
group by idoutlet, address, speciality
having count(*)>=1

entonces agarro siempre el que tiene el id mas bajo, lo de la tabla con
nuevo
y viejo la verdad que lo intente pero no se como identificar cual es cual,
es mas creo que en un rato mas no voy a saber ni quien soy yo :(

-
Ariel Gimenez
-
"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> wrote in


message
news:O6nHCm6%
> 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
> > */
> >


tengo
> que
> > actualizar y


corresponderia
> >
> >
>
>
>
> 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
>
>


Respuesta Responder a este mensaje
#4 Maximiliano D. A.
25/02/2004 - 17:00 | Informe spam
Hola!! fijate si esto te es util, fijate como adaptarlo si?

select min(t1.idaddress) idaddress, t1.idoutlet, t1.address,
t1.speciality,t2.idaddress
from #aprocesar t1 left join (select idaddress, max(idoutlet) as x1,
max(address) as x2,
max(speciality) as x3 from #aprocesar group by idaddress) t2
on

t1.idoutlet = T2.X1 AND
t1.address = T2.X2 AND
t1.speciality = T2.X3

group by t1.idoutlet, t1.address, t1.speciality,t2.idaddress order by
t1.idaddress




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:ucn6qU7%
Alguien me puede dar una mano para implementar lo de la tablita de nuevo y
viejo que me recomienda Maxi?

graciasss
"Ariel Gimenez" wrote in message
news:eegG216%
> Gracias Maximiliano!
> Si tenes razon en lo que me decis, entendiste perfectamente,
> yo cuando saco los que hay que borrar lo hago de la siguiente manera:
>
> select min(idaddress) idaddress, idoutlet, address, speciality
> into #noborrar
> from #aprocesar
> group by idoutlet, address, speciality
> having count(*)>=1
>
> entonces agarro siempre el que tiene el id mas bajo, lo de la tabla con
> nuevo
> y viejo la verdad que lo intente pero no se como identificar cual es


cual,
> es mas creo que en un rato mas no voy a saber ni quien soy yo :(
>
> -
> Ariel Gimenez
> -
> "Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> wrote in
message
> news:O6nHCm6%
> > 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
> > > */
> > >
tengo
> > que
> > > actualizar y
corresponderia
> > >
> > >
> >
> >
> >
> > 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
> >
> >
>
>







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
Respuesta Responder a este mensaje
#5 Javier Loria
25/02/2004 - 17:43 | Informe spam
Hola Ariel:
Muchas gracias por el DDL. Lo unico es que NO PUEDO (vieran que de
trato, pero es inevitable) escribir en contra de los IDENTITIES y del uso de
Llaves Artificiales, cuando uno vee esta clase de regueros.
Una vez sacado esto de mi sistema, veamos como funcionaria. Lo hago por
partes por si acaso necesitas cambiarlo:
Partiendo de la sentencia:
/* SELECT Base de Numero Unico */
SELECT MIN(IdAddress) AS NuevoNumero
, idoutlet
, address
, speciality
FROM #aprocesar
GROUP BY idoutlet, address, speciality
Si este SELECT da la VERDADERA y UNICA Fila de #AProcesar (porque es su
Llave Unica o Primaria Natural), la lista de equivalencias de reemplazo
seria IdAddressOriginal asociado con el Nuevo Numero basados en la la
igualdad de las columnas de la Llave. Algo como:
/* Lista de Reemplazos */
SELECT #aprocesar.IdAddress
,NuevosNumeros.NuevoNumero
FROM (SELECT MIN(IdAddress) AS NuevoNumero
, idoutlet
, address
, speciality
FROM #aprocesar
GROUP BY idoutlet, address, speciality) AS NuevosNumeros
JOIN #AProcesar
ON #Aprocesar.Idoutlet=NuevosNumeros.Idoutlet
AND #Aprocesar.address=NuevosNumeros.address
AND #Aprocesar. speciality=NuevosNumeros.speciality

Este SELECT te da para cada numero de IdAddress el Nuevo Numero. Si
agregar un WHERE #aprocesar.IdAddress<> NuevosNumeros.NuevoNumero, tendrias
todos los que cambian.
Basado en esto pudes hacer el trabajo de Actualizar y Borrar:
/* Finalmente, el Codigo */
/* Que si hace la Limpieza */
BEGIN TRAN
UPDATE #target
SET idaddress=NuevoNumero
FROM #Target
JOIN (SELECT
#aprocesar.IdAddress,
NuevosNumeros.NuevoNumero
FROM (SELECT MIN(IdAddress) AS NuevoNumero
, idoutlet
, address
, speciality
FROM #aprocesar
GROUP BY idoutlet, address, speciality)
AS NuevosNumeros
JOIN #AProcesar
ON #Aprocesar.Idoutlet=NuevosNumeros.Idoutlet
AND #Aprocesar.address=NuevosNumeros.address
AND #Aprocesar.speciality=NuevosNumeros.speciality
WHERE #aprocesar.IdAddress<>
NuevosNumeros.NuevoNumero)
AS Nuevo
ON #Target.IdAddress=Nuevo.IdAddress
DELETE #aprocesar
WHERE #AProcesar.IdAddress NOT IN
(SELECT MIN(IdAddress) AS NuevoNumero
FROM #aprocesar
GROUP BY idoutlet, address, speciality)
COMMIT
Y si te funciona, lo mas rapido que puedas define una llave UNIQUE sobre
el campos: idoutlet, address, speciality. Asi no tendras que volver a
escribir esto codigo INFERNAL.
Si tienes la tentacion de crear tablas temporales con las equivalencias
y eso RESISTE, y dejalas con las tablas derivadas . Si quieres
simplificarcion usa VISTAS. Copia el SELECT, le agregas un "CREATE VIEW
NombreVista AS", antes del SELECT, y listo reemplazas en la los
INSERT/UPDATE con el NombreVista..

Saludos,




Javier Loria
Costa Rica
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.
Ariel Gimenez escribio:
Alguien me puede dar una mano para implementar lo de la tablita de
nuevo y viejo que me recomienda Maxi?

graciasss
"Ariel Gimenez" wrote in
message news:eegG216%
Gracias Maximiliano!
Si tenes razon en lo que me decis, entendiste perfectamente,
yo cuando saco los que hay que borrar lo hago de la siguiente manera:

select min(idaddress) idaddress, idoutlet, address, speciality
into #noborrar
from #aprocesar
group by idoutlet, address, speciality
having count(*)>=1

entonces agarro siempre el que tiene el id mas bajo, lo de la tabla
con nuevo
y viejo la verdad que lo intente pero no se como identificar cual es
cual, es mas creo que en un rato mas no voy a saber ni quien soy yo
:(

-
Ariel Gimenez
-
"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> wrote in
message news:O6nHCm6%
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
*/

tengo que actualizar y
corresponderia







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
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida