String ALTER_TBL ="delete from " + MYDATABASE_TABLE +
" where "+KEY_ID+" in (select "+ KEY_ID +" from "+ MYDATABASE_TABLE+" order by _id LIMIT 3);";
- No hay un comando "top 3" en sqlite yo sepa, hay que añadir un límite
- cuidado con los espacios cuando se agrega cadenas juntas:
"delete from" + TABLE + "where" = "delete frommytablewhere"
Este enfoque utiliza dos pasos para eliminar las primeras N filas.
encontrar las primeras N filas:
SELECT id_column FROM table_name ORDER BY id_column LIMIT 3
El resultado es una lista de identificadores que representan la primera N (aquí): 3 filas. La parte ORDER BY
es importante ya que SQLite no garantiza ninguna orden sin esa cláusula. Sin ORDER BY
, la instrucción podría eliminar 3 filas aleatorias.
Eliminar cualquier fila de la tabla que coincide con la lista de identificadores:
DELETE FROM table_name WHERE id_column IN ({Result of step 1})
Si el resultado del paso 1 es vacía, no sucederá nada, si hay menos de N filas sólo estos serán borrado
Es importante tener en cuenta que el id_column
tiene que ser exclusivo, de lo contrario, se eliminarán más de las filas previstas. En caso de que la columna que se utiliza para ordenar no sea única, toda la declaración se puede cambiar a DELETE FROM table_name WHERE unique_column IN (SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3)
. Sugerencia: SQLite ROWID
es un buen candidato para unique_column
al eliminar en las tablas (puede no funcionar al eliminar en las vistas, no estoy seguro aquí).
Para eliminar los últimos N filas el orden de clasificación se ha revertido a descendente (DESC
):
DELETE FROM table_name WHERE unique_column IN (
SELECT unique_column FROM table_name ORDER BY sort_column DESC LIMIT 3
)
Para eliminar la N º a M º fila del LIMIT
cláusula puede ser extendida por un OFFSET
. Ejemplo a continuación saltaría las 2 primeras filas y volver/eliminar la siguiente 3.
SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3 OFFSET 2
Ajuste de la LIMIT
a un valor negativo (por ejemplo,LIMIT -1 OFFSET 2
) devolverá todas las filas, además de la primera 2 resulta en la eliminación de todo, pero las 2 primeras filas - que también podría llevarse a cabo girando el SELECT .. WHERE .. IN()
en SELECT .. WHERE .. NOT IN()
SQLite tiene una option para permitir que la parte ORDER BY x LIMIT n
directamente la declaración DELETE
sin una sub consulta. Esa opción se no está activado en Android y no puede ser activado, pero esto podría ser de interés para las personas que utilizan SQLite en otros sistemas:
DELETE FROM table_name ORDER BY sort_column LIMIT 3
no se puede utilizar eliminar comunicado con instrucción de selección en la única consulta. – Lucifer
@Lucifer realmente puedes. Pero no puedes poner una eliminación dentro de una selección. vea http://www.sqlite.org/lang_expr.html la expresión es la parte que puede poner después de "dónde" – zapl