Как добавить оператор удаления в этот код? - PullRequest
1 голос
/ 05 октября 2019

Мне нужно понять, как добавить оператор, который удалит результаты следующего запроса:

Я понимаю, что оператор DELETE с предложением WHERE обычно используется, но потому что яВыбрав два разных столбца, предложение where не принимает запятую. Я еще не смог понять, как превратить это в CTE (но, может быть, это излишне?), А затем вызвать его в операторе DELETE (при условии, что это даже вариант). Примеры всегда содержат операторы DELETE FROM ... или WHICH, ни один из которых не представляется реализуемым в этом коде. Нужно ли переписывать свой код, чтобы он включал оператор WHICH?

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

Ожидается, что я смогу создать оператор DELETE для удаления результатов запроса.

1 Ответ

1 голос
/ 05 октября 2019

Я полагаю, что вы могли бы использовать (при условии, что таблица не является таблицей БЕЗ 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 из ряда строк, которые были сгруппированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...