【发布时间】:2018-11-20 18:55:09
【问题描述】:
新版 MySQL 8.0 现已支持Common Table Expressions。
根据手册:
允许在 SELECT、UPDATE 和 DELETE 语句的开头使用 WITH 子句:
WITH ... SELECT ...
WITH ... UPDATE ...
WITH ... DELETE ...
所以,我想,给定下表:
ID lastName firstName
----------------------
1 Smith Pat
2 Smith Pat
3 Smith Bob
我可以使用以下查询:
;WITH ToDelete AS
(
SELECT ID,
ROW_NUMBER() OVER (PARTITION BY lastName, firstName ORDER BY ID) AS rn
FROM mytable
)
DELETE FROM ToDelete
为了从表中删除重复项,就像我在 SQL Server 中所做的那样。
事实证明我错了。当我尝试从 MySQL Workbench 执行 DELETE 语句时,我收到错误:
错误代码:1146。表 'todelete' 不存在
当我尝试使用 CTE 执行 UPDATE 时,我也会收到一条错误消息。
所以,我的问题是,如何在 MySQL 中的 UPDATE 或 DELETE 语句的上下文中使用 WITH 子句(如 8.0 版手册中所述)?
【问题讨论】:
-
如果你用
SELECT * FROM ToDelete替换你的删除语句,这是否也会引发错误,或者它是否有效? -
@Tim 它按预期工作
标签: mysql sql-update common-table-expression sql-delete mysql-8.0