sql >> Base de Datos >  >> RDS >> SQLite

2 formas de eliminar filas duplicadas en SQLite

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.