Как использовать CTE с обновлением / удалением на SQLite?

В SQLite теперь есть CTE, и в документации сказано, что вы можете использовать его с запросами на вставку, обновление и удаление, но приведены только примеры операторов выбора.

Я могу выяснить, как CTE применяются к вставкам, используя insert-select; но как мы можем использовать их в обновлении или удалении, где нет предложения from?

1 ответ

Решение

CTE можно использовать в подзапросах:

WITH NewNames(ID, Name) AS (...)
UPDATE MyTable
SET Name = (SELECT Name
            FROM NewNames
            WHERE ID = MyTable.ID);

WITH IDsToDelete AS (...)
DELETE FROM MyTable
WHERE ID IN IDsToDelete;

Еще один немного более краткий способ использования CTE в SQlite 3.15.0 и новее.

WITH t (id, name, nickname) AS (VALUES (1, "bob", "bobby"), (2, "john", "johnny"))
UPDATE user
SET (name, nickname) = (
    SELECT name, nickname
    FROM t WHERE user.id = t.id
)
WHERE id IN (SELECT id FROM t)
Другие вопросы по тегам