【问题标题】:SQLite delete rows based on multiple columnsSQLite 基于多列删除行
【发布时间】:2016-07-04 15:55:42
【问题描述】:

我对 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 )

【问题讨论】:

  • 以及如何确定第一个条目?
  • @juergend MIN( time ) 好像。
  • DELETE FROM my_table WHERE EXISTS ( SELECT 1 FROM my_table t2 WHERE my_table.colour = t2.colour AND my_table.test = t2.test AND my_table.time &lt; t2.time )
  • @JimmyB 不幸的是,这对我不起作用!
  • @juergend 我更需要每种颜色出现的最早时间

标签: database sqlite


【解决方案1】:

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

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
)

该语句使用了三个值得注意的结构:

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

上面提到了EXISTS的子查询。

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

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

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

所以,声明是这样说的:

my_table 中删除所有在my_table 中至少有一条具有相同colour 和相同test更低 time 的记录。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-05
    • 2021-05-30
    • 2013-06-13
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2014-07-18
    相关资源
    最近更新 更多