SQLite现在有CTE,而documentation表示你可以将它用于插入,更新和删除查询 - 但只提供了select语句的例子。
我可以通过insert-select弄清楚CTE如何应用于插入;但是如果没有from-clause,我们如何在更新或删除中使用它们?
答案 0 :(得分:7)
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;
答案 1 :(得分:2)
在SQlite 3.15.0及更高版本中使用CTE的另一种更为简洁的方法。
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)
作为批量更新非常有用!