如何在SQLite上使用CTE和更新/删除?

Sha*_*ger 7 sql sqlite common-table-expression sql-update

SQLite现在有CTE,文档说你可以使用它来插入,更新和删除查询 - 但只提供了select语句的例子.

我可以通过insert-select弄清楚CTE如何应用于插入; 但是如果没有from-clause,我们如何在更新或删除中使用它们呢?

CL.*_*CL. 8

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;
Run Code Online (Sandbox Code Playgroud)


Tim*_*nen 6

在 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)
Run Code Online (Sandbox Code Playgroud)

作为批量更新效果很好!