database - SQLite 根据多列删除行

标签 database sqlite

我对 SQLite 还很陌生,所以问这个问题!

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

基本上我有这个:

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

我想删除行,以便看起来像:

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

提前致谢!

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

编辑:我可以通过执行以下操作来选择我想要保留的行:

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

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

编辑:以下工作感谢@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 )

最佳答案

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

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(...) 函数来查找最小值。最小值可以定义为不存在更低值的单个值,这就是我们在这里使用的,因为我们实际上对实际值并不感兴趣,而只想识别>包含该值的记录

(由于我们要删除,我们的 SELECT 会生成所有非最小行,我们希望删除这些行以仅保留最小值。)

所以,该声明的内容是:

my_table中删除所有记录,其中my_table中至少有一条具有相同颜色和相同测试的记录较低时间

关于database - SQLite 根据多列删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38188589/

相关文章:

sql-server - SQL Server - 更改 PK 数据类型的最佳方法是什么?

android - SQLite 游标限制 - 1MB

sql - 使用 GDScript 在 SQLite 中传递字符串变量

python - 使用tkinter gui循环在sqlite3数据库中出现操作错误(语法)

iphone - FMDatabase:执行操作:插入,更新,选择,删除

python - float 、小数、价格和部分数量

sql-server - 在 VS Express 2012 for Web 中新创建的 .mdf 下不显示表格

database - 打开没有游标的记录集

c# - 数据输入数据库的速度

iphone sqlite 问题 : "out of memory" on sqlite3_prepare_v2