【问题标题】:SQL delete all rows except some onesSQL删除除某些行之外的所有行
【发布时间】:2011-08-08 23:50:41
【问题描述】:

我有一个包含以下列(网址)的表格:

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

我想:

删除除 10 个未访问的优先更高时间戳之外的所有 url(或者如果所有都被访问,则全部删除)

可以在单个查询中执行此操作吗?无论如何,最好的查询(查询)是什么?

提前致谢

【问题讨论】:

  • 好问题,+1。删除查询中剩下 10 个对我来说很棘手

标签: sql sqlite


【解决方案1】:

我认为 TOP 在 sqlite 中不起作用——需要使用 LIMIT

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

【讨论】:

  • 这不会删除最多 10 条记录吗? OP想要删除所有 but 10
  • @Shredder:不,WHERE 子句是 id NOT IN (...),子查询选择保留 10 行——所以这个查询将删除所有其他行。
【解决方案2】:
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)

我认为这可以满足您的需求。

【讨论】:

  • 你甚至不需要visited = true,sqlite 使用 LIMIT 而不是 TOP,并且没有“未访问”字段;)
猜你喜欢
  • 1970-01-01
  • 2021-12-30
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
相关资源
最近更新 更多