En una Base de Datos bien diseñada nunca deberíamos tener filas duplicadas pero … a veces tal cosa ocurre. Quizás porque heredamos una Base de Datos de alguien que no sabía mucho como se hace un buen diseño.

Entonces ahora tenemos 3 tareas:

  1. Detectar si hay filas duplicadas
  2. Averiguar cuales son las filas duplicadas
  3. Eliminar las filas duplicadas

Aunque se diga “duplicadas”, en realidad debe entenderse como filas que deberían ser únicas y no son únicas, eso incluye: duplicadas, triplicadas, cuadruplicadas, etc.

Para entender mejor, mostraremos un ejemplo. Tenemos una tabla llamada PROVEEDORES. En esa tabla la columna PRO_RUCXXX debería ser única. El RUC es un número que en algunos países se utiliza para identificar a los contribuyentes fiscales.

Primer paso. Detectando si hay filas duplicadas.

Para saber si en la tabla de PROVEEDORES tenemos RUC duplicados, escribimos:

Listado 1.

SELECT
   PRO_RUCXXX,
   COUNT(*) AS CANTIDAD_FILAS
FROM
   PROVEEDORES
GROUP BY
   PRO_RUCXXX
HAVING
   COUNT(*) >= 2

ELIMINANDO1

Captura 1. Si haces clic en la imagen la verás más grande

Al ejecutar el Listado 1. obtenemos lo que vemos en la Captura 1. y así descubrimos que los datos de varios proveedores han sido escritos, incorrectamente desde luego, más de una vez.

Ok, ya sabemos que hay proveedores con datos duplicados, ahora nuestra siguiente tarea es averiguar los datos de esos proveedores.

Segundo paso. Averiguar cuales son las filas duplicadas.

El Listado 1. no nos dice cuales son los identificadores de los proveedores cuyos RUC están duplicados, y eso es algo que nos interesa conocer. Así que escribimos:

Listado 2.

SELECT
   T1.PRO_IDENTI,
   T1.PRO_RUCXXX
FROM
   PROVEEDORES T1
WHERE
   EXISTS (SELECT
              T2.PRO_IDENTI
           FROM
              PROVEEDORES T2
           WHERE
              T1.PRO_RUCXXX = T2.PRO_RUCXXX AND
              T1.PRO_IDENTI > T2.PRO_IDENTI)
ORDER BY
   T1.PRO_RUCXXX

ELIMINANDO2

Captura 2. Si haces clic en la imagen la verás más grande

Ok, ya sabemos cuales son los identificadores y los RUC de los proveedores cuyos datos están duplicados (y también hay un caso de triplicados).

Ahora, nuestra última tarea es eliminar a esas filas que están sobrando.

Tercer paso. Eliminando las filas duplicadas.

Esto ya es muy fácil, es simplemente reemplazar el SELECT del Listado 2. por un DELETE, nos quedaría así:

Listado 3.

DELETE FROM
   PROVEEDORES T1
WHERE
   EXISTS (SELECT
              T2.PRO_IDENTI
           FROM
              PROVEEDORES T2
           WHERE
              T1.PRO_RUCXXX = T2.PRO_RUCXXX AND
              T1.PRO_IDENTI > T2.PRO_IDENTI)

Si al ejecutar el Listado 3. obtenemos un mensaje similar al siguiente: ‘Violation of FOREIGN KEY constraint “FK_COMPRASCAB” on table “COMPRASCAB”‘, eso significa que el Identificador de uno (o más de uno) de los proveedores que quisimos borrar fue usado en la restricción Foreign Key de otra tabla (en este ejemplo, la tabla se llama COMPRASCAB).

¿Solución?

Actualizar el Identificador de proveedor de la tabla que tiene la restricción Foreign Key (en este caso, COMPRASCAB), poniendo un solo Identificador. O sea que si en la fila cuyo Identificador es 81 el RUC es 1421744-9 y en la fila cuyo Identificador es 162 el RUC también es 1421744-9, debemos cambiar el Identificador 162 por el Identificador 81 en todas las filas de la tabla COMPRASCAB cuyo Identificador sea 162.

O sea, en la tabla COMPRASCAB, todos los Identificadores de proveedores 162 se cambiarán por 81.

¿Y cómo podemos ver los Identificadores de todos los proveedores que tiene RUC repetidos?

Con un SELECT similar al siguiente:

Listado 4.

SELECT
   T1.PRO_IDENTI,
   T1.PRO_RUCXXX
FROM
   PROVEEDORES T1
WHERE
   EXISTS (SELECT
              T2.PRO_RUCXXX
           FROM
              PROVEEDORES T2
           WHERE
              T1.PRO_RUCXXX = T2.PRO_RUCXXX
           GROUP BY
              T2.PRO_RUCXXX
           HAVING
              COUNT(*) >= 2)
ORDER BY
   T1.PRO_RUCXXX

ELIMINANDO3

Captura 3. Si haces clic en la imagen la verás más grande

En la Captura 3. vemos el resultado de ejecutar el Listado 4. y así podremos saber cuales son los Identificadores de los proveedores cuyos RUC están repetidos.

Conclusión:

En nuestras tablas no debemos tener filas duplicadas pero a veces tal cosa ocurre. En casos así nuestras tareas serán detectar si hay filas duplicadas, encontrar cuales son las filas duplicadas, y eliminar las filas duplicadas.

Algo que está en la Base de Datos pero que no debería estar se llama basura, y las filas duplicadas son un ejemplo de basura.

Artículos relacionados:

Obteniendo la primera fila de cada grupo

El índice del blog Firebird21

El foro del blog Firebird21

 

Anuncios