Duplicados...

20/04/2004 - 08:38 por Daniel Rodriguez | Informe spam
Hola a todos...

Os paso a contar mi problema, a ver si me explicais alguna forma mejor de
hacer lo que quiero hacer...

En fin, alla voy...

Necesito encontrar (en una tabla de 450.000 registros ) los que están
duplicados entre si.

Es decir, la tabla puede ser algo asi:

IdRegistro Nombre Apellidos


Por facilidad en el manejo lo que hago es duplicar esta tabla para comparar
la original(Tabla2) y la duplicada (Tabla1).

Hasta ahi bien todo.
Posteriormente hago las consultas apropiadas para localizar registros de la
Tabla1 que estan repetidos en la Tabla2 (logicamente desecho los que tienen
el idregistro igual, o sea, consigo mismo.

Las consultas son del tipo:
SELECT DISTINCT D1.IdRegistro AS Original, D2.IdRegistro AS
Duplicado
FROM Tabla1 D1 INNER JOIN
Tabla2 D2 ON D1.IdRegistro <> D2.IdRegistro AND
D1.Nombre = D2.Nombre AND D1.Apellidos = D2.Apellidos
WHERE (LEN(D1.Nombre + D1.Apellidos) > 1)
Algunas mas, por ejemplo, me seleccionan los que siendo el
nombre igual, tienen el apellido parecido y cosas asi...


Estos resultados los inserto en una tabla auxiliar, de forma que obtengo
una tabla de este tipo:

Original (IdRegistro Tabla1) Duplicado (IdRegistro Tabla2)
-
-
1
2
1
3
1
4
2
1
2
3
2
4
3
1
3
2
3
4
4
1
4
3
4
2
10
11
11
10
3
6 -- resultado obtenido por otra de las consultas
6
3

por ejemplo. Obtengo a lo mejor 50000 registros como estos.

Hasta ahi no se qué pensais sobre lo que estoy haciendo... lo mismo estoy
haciendo una tonteria, pero es lo que se me ha ocurrido... ;))

Entonces, de esa tabla auxiliar quiero obtener algo asi:
1 2
1 3 (Como el 2 duplicado con el 1 y 3 duplicado con el 2,
entonces 3 duplicado con el uno)
1 4
3 6 Aunque seria mejor que fuese 1 6 (Como 1
duplicado con 3, y 3 con el 6, entonces el 1 y el 6 son duplicados)
10 11


En fin... un follon que no se hasta qué punto se puede hacer de manera
sencilla.

De momento lo he logrado mediante un procedimiento que recorre la tabla y va
actualizando en funcion de lo que lee, es decir,
con un cursor leo el primero:
1 y 2. Entonces actualizo todos los que tienen un 2 en el
original, a 1
1 y 3 Entonces actualizo todos los que tienen un 3 en el
original, a 1, etc

Luego elimino los que tienen el original y el duplicado iguales.

En fin, un apaño que de momento iba bien, hasta que se juntaron 50000
registros de resultados y el proceso tarda como que 5 minutos...
Y no me gustaria que tardase tanto...

En fin, con la parrafada que os he contao, lo mismo os habeis aburrido ya.
Quiza no habeis entendido nada del rollo contado, pero bueno jeje

A los que hayais llegado hasta aquí, me podreis contar si se os ocurre forma
mejor (seguro que si). Os lo agradezco de verdad.


Muchas gracias de antemano.

Salu2!!!!

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
20/04/2004 - 09:41 | Informe spam
Para encontrar duplicados de una tabla se utiliza la siguiente
instrucción:

SELECT COUNT(*), campo1, campo2
FROM laTabla
GROUP BY campo1, campo2
HAVING COUNT(*) > 1

los campos que pongas en el GROUP BY son los que consideras tú que
pueden estar duplicados

Luego, para eliminar los duplicados existen varias opciones. Una de
ellas está propuesta por el maestro Fernando Guerrero, y que puedes
encontrar en esta dirección:

http://groups.google.es/groups?hl=e...t8z5sjBHA.
1812%40tkmsftngp07&rnum



Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Daniel Rodriguez" escribió en el mensaje
news:
Hola a todos...

Os paso a contar mi problema, a ver si me explicais alguna forma mejor de
hacer lo que quiero hacer...

En fin, alla voy...

Necesito encontrar (en una tabla de 450.000 registros ) los que están
duplicados entre si.

Es decir, la tabla puede ser algo asi:

IdRegistro Nombre Apellidos


Por facilidad en el manejo lo que hago es duplicar esta tabla para


comparar
la original(Tabla2) y la duplicada (Tabla1).

Hasta ahi bien todo.
Posteriormente hago las consultas apropiadas para localizar registros de


la
Tabla1 que estan repetidos en la Tabla2 (logicamente desecho los que


tienen
el idregistro igual, o sea, consigo mismo.

Las consultas son del tipo:
SELECT DISTINCT D1.IdRegistro AS Original, D2.IdRegistro AS
Duplicado
FROM Tabla1 D1 INNER JOIN
Tabla2 D2 ON D1.IdRegistro <> D2.IdRegistro AND
D1.Nombre = D2.Nombre AND D1.Apellidos = D2.Apellidos
WHERE (LEN(D1.Nombre + D1.Apellidos) > 1)
Algunas mas, por ejemplo, me seleccionan los que siendo el
nombre igual, tienen el apellido parecido y cosas asi...


Estos resultados los inserto en una tabla auxiliar, de forma que


obtengo
una tabla de este tipo:

Original (IdRegistro Tabla1) Duplicado (IdRegistro


Tabla2)
-
1
2
1
3
1
4
2
1
2
3
2
4
3
1
3
2
3
4
4
1
4
3
4
2
10
11
11
10
3
6 -- resultado obtenido por otra de las consultas
6
3

por ejemplo. Obtengo a lo mejor 50000 registros como estos.

Hasta ahi no se qué pensais sobre lo que estoy haciendo... lo mismo estoy
haciendo una tonteria, pero es lo que se me ha ocurrido... ;))

Entonces, de esa tabla auxiliar quiero obtener algo asi:
1 2
1 3 (Como el 2 duplicado con el 1 y 3 duplicado con el 2,
entonces 3 duplicado con el uno)
1 4
3 6 Aunque seria mejor que fuese 1 6 (Como 1
duplicado con 3, y 3 con el 6, entonces el 1 y el 6 son duplicados)
10 11


En fin... un follon que no se hasta qué punto se puede hacer de manera
sencilla.

De momento lo he logrado mediante un procedimiento que recorre la tabla y


va
actualizando en funcion de lo que lee, es decir,
con un cursor leo el primero:
1 y 2. Entonces actualizo todos los que tienen un 2 en el
original, a 1
1 y 3 Entonces actualizo todos los que tienen un 3 en el
original, a 1, etc

Luego elimino los que tienen el original y el duplicado


iguales.

En fin, un apaño que de momento iba bien, hasta que se juntaron 50000
registros de resultados y el proceso tarda como que 5 minutos...
Y no me gustaria que tardase tanto...

En fin, con la parrafada que os he contao, lo mismo os habeis aburrido ya.
Quiza no habeis entendido nada del rollo contado, pero bueno jeje

A los que hayais llegado hasta aquí, me podreis contar si se os ocurre


forma
mejor (seguro que si). Os lo agradezco de verdad.


Muchas gracias de antemano.

Salu2!!!!


Respuesta Responder a este mensaje
#2 Daniel Rodriguez
20/04/2004 - 10:04 | Informe spam
Muchas gracias por tu respuesta Carlos.

Mi problema, y por ahi viene la comedura de cabeza que tengo, es que :

- No necesariamente deben ser iguales:
por ejemplo, Francisco Javier \ Osorio Rodriguez y Francisco \
Osorio Rodriguez son realmente registros duplicados, aunque no son
exactamente iguales.
Lo que necesito es mostrar en pantalla esos dos registros, y que el
operador seleccione si son o no duplicados, y cual quiere mantener.
Por eso lo de la tabla auxiliar guardando el Id de los registros...
En cuanto a encontrar los duplicados hago una secuencia de
consultas, que me guardan en la auxiliar estos pares.
Busco pues si el nombre y apellidos son iguales, o si el nombre es
igual y 5 caracteres del apellidos, en fin, criterior de ese tipo
obtenidos del estudio de los datos. Eso lo tengo, y me devuelve
resultados bastante fiables y en un tiempo aceptable.

- Por otro lado, como te he comentado, necesitaria mostrar esos datos a un
operador que basicamente tomará la decision de
si hay o no duplicidad.
Es decir, si en la tabla auxiliar tengo el registro 1 con el 2,
y el dos con el uno, le debo mostar el registro 1 y el 2 para que decida.
Si en la tabla tengo los pares: 1 y 2 , 2 y 3 quiero
mostar el registro 1, el 2 y el 3 para que decida...


Estonces, lo que me esta resultando mas complicado es dejar limpia esa tabla
auxiliar de forma que me agrupe los registros en base a uno de ellos (en el
ejemplo, agrupa todos en funcion del registro 1)
quedando algo asi: 1 2
1 3


Ya ves, lo tengo chungo, no?? jejeje.

Si quieres pensar un rato... ahi lo tienes. jeje

Oye, muchas gracias de nuevo a ti y por supuesto a todos los que os tomais
la molestia de ayudar a los iniciados...

Muy amables.




Salu2!!

Daniel R.
Respuesta Responder a este mensaje
#3 Carlos Sacristan
20/04/2004 - 11:35 | Informe spam
Mmmmmmmm... ya veo dónde está la complicación (y la lentitud de la
consulta, por lo que has comentado). Otra opción es que SQL Server se
encargue de mostrarte los registros que tú consideras que son duplicados
(las consultas que dices te devuelven los resultados en un tiempo aceptable)
y que la aplicación que presenta los datos al usuario sea la encargada de
agrupar los registros del modo que comentas, seguro que los tiempos
mejorarán.

De todos modos pensaré a ver si se me ocurre alguna opción más eficiente


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Daniel Rodriguez" escribió en el mensaje
news:OD#
Muchas gracias por tu respuesta Carlos.

Mi problema, y por ahi viene la comedura de cabeza que tengo, es que :

- No necesariamente deben ser iguales:
por ejemplo, Francisco Javier \ Osorio Rodriguez y Francisco \
Osorio Rodriguez son realmente registros duplicados, aunque no son
exactamente iguales.
Lo que necesito es mostrar en pantalla esos dos registros, y que el
operador seleccione si son o no duplicados, y cual quiere mantener.
Por eso lo de la tabla auxiliar guardando el Id de los


registros...
En cuanto a encontrar los duplicados hago una secuencia de
consultas, que me guardan en la auxiliar estos pares.
Busco pues si el nombre y apellidos son iguales, o si el nombre es
igual y 5 caracteres del apellidos, en fin, criterior de ese tipo
obtenidos del estudio de los datos. Eso lo tengo, y me devuelve
resultados bastante fiables y en un tiempo aceptable.

- Por otro lado, como te he comentado, necesitaria mostrar esos datos a un
operador que basicamente tomará la decision de
si hay o no duplicidad.
Es decir, si en la tabla auxiliar tengo el registro 1 con el


2,
y el dos con el uno, le debo mostar el registro 1 y el 2 para que decida.
Si en la tabla tengo los pares: 1 y 2 , 2 y 3 quiero
mostar el registro 1, el 2 y el 3 para que decida...


Estonces, lo que me esta resultando mas complicado es dejar limpia esa


tabla
auxiliar de forma que me agrupe los registros en base a uno de ellos (en


el
ejemplo, agrupa todos en funcion del registro 1)
quedando algo asi: 1 2
1 3


Ya ves, lo tengo chungo, no?? jejeje.

Si quieres pensar un rato... ahi lo tienes. jeje

Oye, muchas gracias de nuevo a ti y por supuesto a todos los que os tomais
la molestia de ayudar a los iniciados...

Muy amables.




Salu2!!

Daniel R.


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