Las siguientes opciones se pueden usar para eliminar filas duplicadas en SQLite.
Estos ejemplos eliminan las filas duplicadas pero conservan una. Entonces, si hay tres filas idénticas, por ejemplo, elimina dos de ellas y mantiene una. Esto a menudo se denomina eliminación de duplicados de la tabla.
Datos de muestra
Supongamos que tenemos una tabla con los siguientes datos:
SELECT * FROM Pets;
Resultado:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog 4 Bark Dog 4 Bark Dog
Podemos ver que las dos primeras filas están duplicadas, al igual que las últimas tres filas.
En este caso, todas las columnas son duplicados. No hay clave principal. El PetId
la columna podría aparentar como si pudiera ser una clave principal, pero en realidad contiene valores duplicados. Por lo tanto, no es un identificador único para cada fila y no se puede usar como clave principal.
Si hubiera una clave principal, contendría valores únicos en todas las filas y no habría duplicados.
En cualquier caso, a continuación hay dos opciones para buscar y eliminar filas duplicadas.
Opción 1
Antes de desduplicar la tabla, podemos usar la siguiente consulta para ver qué fila/s se eliminarán:
SELECT * FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
Resultado:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Esto nos muestra que se eliminarán tres filas cuando eliminemos los duplicados de la tabla en el siguiente paso.
Para eliminar los valores duplicados, podemos modificar la consulta anterior reemplazando SELECT *
con DELETE
:
DELETE FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
SELECT * FROM Pets;
Resultado:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
La tabla ahora ha sido deduplicada.
Como era de esperar, una de las filas duplicadas de nuestro perro "Wag" se eliminó y la otra permanece. También se han eliminado dos de las filas duplicadas para "Ladrar".
La razón por la que pudimos hacer esto es por el rowid
de SQLite. . De forma predeterminada, cada fila en SQLite tiene una columna especial, generalmente llamada rowid
, que identifica de forma única esa fila dentro de la tabla. A menos que se haya eliminado explícitamente de la tabla, puede usar esto como un identificador único para cada fila, lo que nos permite construir las consultas anteriores. Lo mismo se aplica al siguiente ejemplo.
Opción 2
Suponiendo que la tabla se haya restaurado con sus datos originales (incluidas las filas duplicadas), esta es otra opción para desduplicarla.
Compruebe qué filas se eliminarán:
SELECT * FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
Resultado:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Ahora elimine esas filas:
DELETE FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
SELECT * FROM Pets;
Resultado:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
La tabla ha sido deduplicada.