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

#6 Ariel Gimenez
25/02/2004 - 18:19 | Informe spam
Gracias Maxi de nuevo!

"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> wrote in message
news:uaK1ij7%
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
#7 Ariel Gimenez
25/02/2004 - 18:20 | Informe spam
Javier, no lo puedo creer
E X C E L E N T E!!!!!
el select que te mandaste!, la verdad que todavia no entiendo como funciona
pero lo importante es que anda PERFECTOOOOO, menos mal que me hechaste una
mano ya que por la complejidad me hubiera llevado varios dias llegar a eso,
millones de gracias realmente me has ayudado en forma!

Saludos
Ariel Gimenez



"Javier Loria" wrote in message
news:uuKPx67%
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
#8 Manuel Etcheto
25/02/2004 - 18:44 | Informe spam
Hola Javier:
Yo había pensado proponerle una UDF en vez de #tablas,
pero no se si será más eficiente

CREATE FUNCTION dbo.IdMinimo(@idaddress int)
Returns INT
As
Begin
Declare @id int
SELECT @id = MIN(A.idaddress) FROM aprocesar A, aprocesar B
WHERE A.idoutlet = B.idoutlet
AND A.address = B.address
AND A.speciality = B.speciality
AND B.idaddress = @idaddress
Return @id
End
GO
UPDATE target SET idaddress = dbo.IdMinimo(idaddress)
DELETE aprocesar WHERE idaddress <> dbo.IdMinimo(idaddress)

Luego crear la llave como dices

Salu2
Manuel


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"








yahoo.com> 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
*/











registros que
tengo que actualizar y










que les
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


.

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