SQLite 基于多列删除行

the*_*ler 2 database sqlite

我对 SQLite 很陌生,因此问了这个问题!

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

基本上我有这个:

测试 | 颜色 | 一次
| 黄色 | 8
个| 红色 | 6
一 | 黄色 | 10
两 | 红色 | 4

我想删除行,这样看起来像:

测试 | 颜色 | 一次
| 黄色 | 8
两 | 红色 | 4

提前致谢!

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

编辑:我可以通过这样做来选择我想要保留的行:

select * from ( select * from COL_TABLE order by time desc) x group by colour;

这会产生所需的结果,但我想删除选择结果中不存在的内容。

编辑:以下工作感谢@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 )
Run Code Online (Sandbox Code Playgroud)

Jim*_*myB 5

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

SELECTs 中的子查询一样,它们可以引用外部语句中的表来创建匹配项。

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

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
)
Run Code Online (Sandbox Code Playgroud)

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

  • 子查询 DELETE
  • 自加入
  • 模拟 a MIN(...),通过自连接

EXISTS上面提到的子查询。

每当必须将表的一行与同一表的其他行进行比较时,就需要自联接。查找某列的最小值正是如此。

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

(由于我们正在删除,我们SELECT产生了所有最小行,我们希望删除这些行以仅保留最小值。)

所以,声明说的是:

删除my_table其中至少有一个记录my_table相同colour和相同test较低的 所有记录time