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