Я полагаю, что вы могли бы использовать (при условии, что таблица не является таблицей БЕЗ ROWID): -
DELETE FROM mytable WHERE rowid IN (SELECT rowid FROM mytable GROUP BY field1, field2 HAVING SUM(field3) IS NULL);
Альтернатива с использованием 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 использовалось в качестве имени таблицы вместо таблицы.
С учетом комментария
Первичным ключом является поле1
, затем: -
DELETE FROM mytable WHERE field1 IN (SELECT field1 FROM mytable GROUP BY field1, field2 HAVING SUM(field3) IS NULL);
можно будет использовать независимо от того, будет ли это работатьтаблица определена как таблица БЕЗ ROWID, аналогичное изменение может быть применено к версии CTE.
Примечания
Использование GROUP BY на ПЕРВИЧНОМ КЛЮЧЕ, поскольку оно УНИКАЛЬНО, приведет кстолько групп и, следовательно, строк, сколько строк. Фактически запрос может быть SELECT field1 FROM mytable WHERE field3 IS NULL
, и, следовательно, удаление может быть просто DELETE FROM mytable WHERE field3 IS NULL
.
. Если бы это было не так, и field1 не было ПЕРВИЧНЫМ КЛЮЧОМ, то сложность заключается в том, чтозначения для группы, которые не являются агрегированными значениями, являются значениями из произвольно выбранной строки. Короче говоря, вы удалили бы 1 из ряда строк, которые были сгруппированы.