【发布时间】:2014-02-17 01:17:44
【问题描述】:
SQLite 现在有 CTE,documentation 表示您可以将它用于插入、更新和删除查询——但只提供了选择语句的示例。
我可以通过 insert-select 弄清楚 CTE 如何应用于插入;但是我们如何在没有 from 子句的更新或删除中使用它们?
【问题讨论】:
标签: sql sqlite sql-update common-table-expression
SQLite 现在有 CTE,documentation 表示您可以将它用于插入、更新和删除查询——但只提供了选择语句的示例。
我可以通过 insert-select 弄清楚 CTE 如何应用于插入;但是我们如何在没有 from 子句的更新或删除中使用它们?
【问题讨论】:
标签: sql sqlite sql-update common-table-expression
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;
【讨论】:
在 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)
非常适合作为批量更新!
【讨论】: