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中一样 。
原来我错了。当我尝试DELETE从MySQL Workbench 执行stament时出现错误:
DELETE
错误代码:1146。表“ todelete”不存在
当我尝试UPDATE使用CTE 时,还会收到一条错误消息。
UPDATE
因此,我的问题是,如何在MySQL WITH的UPDATEor DELETE语句的上下文中使用子句(如8.0版的手册中所述)?
WITH
这似乎是MySQL中已发布的错误8.x。从此错误报告:
8.x
在2015年版本的SQL标准中,无法在UPDATE中定义CTE。MySQL允许它,但将CTE设为只读(我们现在正在更新文档以提及这一点)。也就是说,可以使用视图代替CTE;那么该视图可能是可更新的,但是由于存在窗口函数,因此该视图被具体化为临时表(未合并),因此不可更新(我们还将在文档中提及它)。 以上所有内容也适用于DELETE。
在2015年版本的SQL标准中,无法在UPDATE中定义CTE。MySQL允许它,但将CTE设为只读(我们现在正在更新文档以提及这一点)。也就是说,可以使用视图代替CTE;那么该视图可能是可更新的,但是由于存在窗口函数,因此该视图被具体化为临时表(未合并),因此不可更新(我们还将在文档中提及它)。
以上所有内容也适用于DELETE。
如果您按照上面的错误链接,您将看到建议使用CTE的一种解决方法,但是它涉及将CTE以一对一的方式连接到原始目标表。根据您的示例(一揽子删除),尚不清楚您需要使用哪种CTE进行删除的解决方法。