2011-08-08 33 views
11

Tengo una tabla con las siguientes columnas (de URLs):SQL borrar todas las filas excepto algunos

[id,url,visited,timestamp] 
Types:[int,string,int,long] 

Quiero:

Borra todas las direcciones URL, excepto 10 unvisited priorizando mayor marca de tiempo (o borrar todos si todos son visitados, por ejemplo)

¿Es posible hacer eso en una sola consulta? De todos modos, ¿cuál es la mejor consulta (consultas) para hacerlo?

Gracias de antemano

+0

Buena pregunta, 1 LÍMITE. 10 restantes en la consulta de eliminación me resultan difíciles –

Respuesta

19

No creo TOP trabaja en SQLite - necesidad de utilizar

DELETE FROM mytable WHERE id NOT IN ( 
    SELECT id FROM mytable 
    WHERE visited = false 
    ORDER BY timestamp DESC 
    LIMIT 10 
    ) 
+0

+1 - Corrige la sintaxis y los nombres de campo. Woo hoo! :) – MatBailie

+0

¿No eliminará esto 10 registros como máximo? El OP quiere borrar todo * pero * 10 –

+0

@Shredder: No, la cláusula 'WHERE' es' id NOT IN (...) 'y la subconsulta selecciona las 10 filas para conservar, por lo que esta consulta eliminará todas los demás. – cdhowie

5
DELETE FROM tableofDeletion 
WHERE 
    -- Delete all items not in the following select 
    -- ordered by the timestamp so we can get the top 10 
    id NOT IN (SELECT id 
      FROM tableofDeletion 
      WHERE 
       visited = 0 -- false 
      ORDER BY timestamp DESC 
      LIMIT 10) 

creo que esto ofrece lo que usted está buscando.

+0

Ni siquiera necesita el 'visited = true', sqlite usa LIMIT y no TOP, y no hay un campo" no visitado ";) – MatBailie

+0

Hombre, eso es un error para mí. ;) – Travis

Cuestiones relacionadas