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

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


Preguntas similares