Sqlite 如何将delete语句添加到此代码中?

Sqlite 如何将delete语句添加到此代码中?,sqlite,Sqlite,我需要了解如何添加将删除以下查询结果的语句: 我知道通常会使用带有WHERE子句的DELETE语句,但因为我选择了两个不同的列,WHERE子句不接受逗号。我还没有弄清楚如何将其转换为CTE(但这可能有点过头了?),然后在DELETE语句中调用它(假设这是一个选项)。示例中总是有DELETEFROM…,或WHICH语句,这两个语句在本代码下似乎都不可实现。我是否必须重写代码,使其包含哪个语句 SELECT field1, field2 FROM table GROUP BY

我需要了解如何添加将删除以下查询结果的语句:

我知道通常会使用带有WHERE子句的
DELETE
语句,但因为我选择了两个不同的列,WHERE子句不接受逗号。我还没有弄清楚如何将其转换为CTE(但这可能有点过头了?),然后在
DELETE
语句中调用它(假设这是一个选项)。示例中总是有
DELETE
FROM…,或
WHICH
语句,这两个语句在本代码下似乎都不可实现。我是否必须重写代码,使其包含
哪个
语句

SELECT     field1,  field2
FROM       table
GROUP BY   field1, field2
HAVING     SUM(field3) IS NULL

希望能够建立一个
DELETE
语句来删除查询结果。

我相信您可以使用(假设该表不是一个没有ROWID的表):-

使用CTE的备选方案(CTE已被命名为删除)为:-

WITH deletions(rowid) AS (SELECT rowid
FROM       mytable
GROUP BY   field1, field2
HAVING     SUM(field3) IS NULL
)
DELETE FROM mytable WHERE rowid IN (SELECT rowid FROM deletions);
  • 请注意,mytable已被用作表名,而不是表名

考虑到评论

主键是field1

然后:-

 DELETE FROM mytable WHERE field1 IN (SELECT field1 FROM mytable GROUP BY field1, field2 HAVING SUM(field3) IS NULL);
如果可以使用,则无论该表是否定义为不带ROWID的表,这都将起作用,类似的更改可以应用于CTE版本

笔记 在主键上使用GROUPBY(因为它是唯一的)将产生与行数相同的组数和行数。实际上,查询可以是
从mytable中选择field1,其中field3为NULL
,因此删除可以是
从mytable中删除,其中field3为NULL


如果情况并非如此,并且字段1不是主键,那么复杂的是,每个组中未聚合的值都是来自任意选择行的值。简而言之,您将从分组的行中删除1。

表的结构是什么(SQL中使用的坏名称-它是一个保留字)-主键是什么?用于win!我回头看了一下表,发现Field1实际上对于表中表示的实体是唯一的,但对于表本身并不是唯一的(因此我收回了关于主键的注释)。
rowid
是我所需要的。谢谢,好先生!
 DELETE FROM mytable WHERE field1 IN (SELECT field1 FROM mytable GROUP BY field1, field2 HAVING SUM(field3) IS NULL);