Как использовать 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)