人们说CTE是一个视图,您不能在CTE中设置变量。但是,我成功地在CTE中设置了一个变量@ttl,运行以下查询:
with CTE as (select @ttl:=(select sum(num) from test))当我运行这个程序时,我想到了另一种设置变量的方法,我得到了一个错误:
with CTE as (set @ttl=(select sum(num) from test))我很困惑。究竟什么是可行的,哪些不是在CTE中设置变量?
发布于 2021-01-03 18:35:41
括号中的内容是子查询;子查询总是SELECT语句。
https://dev.mysql.com/doc/refman/8.0/en/with.html:
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.
的未来版本中会被删除。
发布于 2021-01-03 19:34:47
添加@ysth中的答案后,可以使用INTO将select列表中的表达式分配给变量:
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必须位于外部查询中。如果您试图在子查询中使用它,则会得到以下错误:
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的未来版本中也是如此,因为使用:=的副作用分配会导致错误。
https://stackoverflow.com/questions/65553300
复制相似问题