MySQL中`with xxx AS()`的等效语法是啥

Posted

技术标签:

【中文标题】MySQL中`with xxx AS()`的等效语法是啥【英文标题】:What's the equivalent syntax in MySQL for `with xxx AS ()`MySQL中`with xxx AS()`的等效语法是什么 【发布时间】:2021-05-11 15:34:04 【问题描述】:

在 MSSQL 中,我有一个类似的查询:

WITH temp AS (
SELECT
    *
FROM
  xx.xxxx
)

但是 mysql 语法不支持 WITH temp AS (),我想知道 MySQL Workbench 中的等效语法应该是什么?谢谢。

下面是语法错误的截图:

【问题讨论】:

MySQL 支持。如果您使用的是旧版本的 MySQL 5.x,我强烈建议您升级。 @TheImpaler 您好,我目前正在使用 MySQL Workbench v8.0,但出现错误Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'temp AS ( xxxxxx' at line 1,我刚刚上传了问题描述中的错误截图。 您可能正在使用 MySQL Workbench 8.0,但这只是一个客户端。支持的 SQL 语法取决于 MySQL 服务器。您可以使用此查询检查服务器的版本:SELECT VERSION(); 【参考方案1】:

如果你有 MySQL 5.x 并且你需要修改包含 CTE 的查询,然后转换

WITH cte AS (cte query text)
SELECT ... 
FROM cte
...

SELECT ... 
FROM (cte query text) cte
...

如果有多个 CTE,则执行从后一个 CTE 到前一个 CTE 的准确替换(您可能需要使用某些 CTE 子查询文本的多个副本 - 这是正常现象)。

【讨论】:

您好,您是指 MySQL Workbench 的版本吗?我使用的是 v8.0 而不是 5.x dev.mysql.com/downloads/workbench 我正在使用它来运行查询... 啊谢谢,我正在使用5.7.12 (MySQL Community Server),我尝试了你在答案中提到的语法,它给了我一个不同的错误Error Code: 1370. execute command denied to user 'xxx'@'%' for routine xxx.DATEADD',你知道这里发生了什么吗? @Cecilia SQL Server 代码无法直接转换为 MySQL 代码 - 语法差异太多。方言转换是单独的、有时相当复杂、有时甚至无法解决的任务。创建另一个处理转换的问题,并发布要转换的完整 SQL。

以上是关于MySQL中`with xxx AS()`的等效语法是啥的主要内容,如果未能解决你的问题,请参考以下文章

理解Python中的with…as…语法

MySQL - WITH RECURSIVE AS 递归查询

MySQL - WITH RECURSIVE AS 递归查询

MySQL - WITH RECURSIVE AS 递归查询

mysql进阶 with-as 性能调优

MySQL - WITH...AS 创建临时表复用子查询