SQLite基于多个列删除行

时间:2016-07-04 15:55:43

标签: database sqlite

我对SQLite很新,因此问这个问题!

我需要删除表格中的行,以便我根据列Y(时间)最早出现列X(颜色)中的每个唯一值。

基本上我有这个:

测试|颜色|时间(s)
一个|黄色| 8
一个|红色| 6
一个|黄色| 10个
两个|红色| 4

我想删除行,如下所示:

测试|颜色|时间(s)
一个|黄色| 8
两个|红色| 4

提前致谢!

编辑:为了更清楚,无论测试如何,我都需要及时保留每种颜色发生的最早出现。

编辑:我可以选择要保留的行:

select * from(按时间desc从COL_TABLE顺序中选择*)x按颜色分组;

产生所需的结果,但我想删除select中的结果。

编辑:以下工作归功于@JimmyB:

   DELETE FROM COL_TABLE WHERE EXISTS ( SELECT * FROM COL_TABLE t2 WHERE     COL_TABLE .colour = t2.colour AND COL_TABLE .test = t2.test AND COL_TABLE .time < t2.time )

1 个答案:

答案 0 :(得分:3)

您可以在EXISTS语句的NOT EXISTS子句中包含子查询(WHERE / DELETE)。

SELECT中的子查询类似,这些子查询可以引用外部语句中的表来创建匹配。

在你的情况下,试试这个:

DELETE FROM my_table
WHERE EXISTS (
  SELECT *
  FROM my_table t2
  WHERE my_table.colour = t2.colour
  AND my_table.test = t2.test
  AND my_table.time < t2.time
)

本声明使用了三个值得注意的结构:

  • DELETE
  • 中的子查询
  • 自加入
  • 通过自我加入模拟MIN(...)

上面提到了EXISTS的子查询。

只要必须将表的一行与同一个表的其他行进行比较,就需要自联接。找到某列的最小值就是这样。

通常,您使用MIN(...)函数来查找最小值。最小值可以定义为不存在 lower 值的单个值,这就是我们在这里使用的值,因为我们实际上并不对实际值感兴趣,而只想识别记录,其中包含该值。

(由于我们正在删除,我们的SELECT会产生所有 - 最小行,我们要删除这些行以仅保留最小值。)

所以,声明说的是:

删除my_tablemy_table至少有一条记录的所有记录,colour中的记录与test相同time更低 @Controller @RequestMapping("/rest") public class RestfulTodoController { @ExceptionHandler(ReturnLoginMessage.class) @ResponseBody public ReturnLoginMessage handleException(final ReturnLoginMessage e) { return e; } // and your login handler method }