首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL在CTE中设置了一个变量:"select“很好,但是" set”不起作用

问MySQL在CTE中设置了一个变量:"select“很好,但是" set”不起作用
EN

Stack Overflow用户
提问于 2021-01-03 18:17:17
回答 2查看 698关注 0票数 0

人们说CTE是一个视图,您不能在CTE中设置变量。但是,我成功地在CTE中设置了一个变量@ttl,运行以下查询:

代码语言:javascript
复制
with CTE as (select @ttl:=(select sum(num) from test))

当我运行这个程序时,我想到了另一种设置变量的方法,我得到了一个错误:

代码语言:javascript
复制
with CTE as (set @ttl=(select sum(num) from test))

我很困惑。究竟什么是可行的,哪些不是在CTE中设置变量?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-03 18:35:41

括号中的内容是子查询;子查询总是SELECT语句。

https://dev.mysql.com/doc/refman/8.0/en/with.html:

代码语言:javascript
复制
with_clause:
    WITH [RECURSIVE]
        cte_name [(col_name [, col_name] ...)] AS (subquery)
        [, cte_name [(col_name [, col_name] ...)] AS (subquery)] ...

https://dev.mysql.com/doc/refman/8.0/en/subqueries.html:

子查询是另一个语句中的SELECT语句。

请注意,mysql在SET语句之外的任何地方都不推荐设置变量,因此在将来的版本中,即使是第一个CTE也会出现错误。

https://dev.mysql.com/doc/refman/8.0/en/user-variables.html:

以前的MySQL版本使在SET以外的语句中为用户变量赋值成为可能。该功能在MySQL 8.0中是支持向后兼容性的,但在MySQL.

的未来版本中会被删除。

票数 1
EN

Stack Overflow用户

发布于 2021-01-03 19:34:47

添加@ysth中的答案后,可以使用INTO将select列表中的表达式分配给变量:

代码语言:javascript
复制
mysql> insert into test set num=42;

mysql> with cte as (select sum(num) as num from test) 
       select num into @ttl from cte;

mysql> select @ttl;
+------+
| @ttl |
+------+
|   42 |
+------+

注意,INTO必须位于外部查询中。如果您试图在子查询中使用它,则会得到以下错误:

代码语言:javascript
复制
mysql> with cte as (select sum(num) into @ttl from test) 
       select * from cte;
ERROR 3954 (HY000): Misplaced INTO clause, INTO is not allowed inside subqueries, 
and must be placed at end of UNION clauses.

我假设INTO语法仍然是合法的,即使在MySQL的未来版本中也是如此,因为使用:=的副作用分配会导致错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65553300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档