请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,关于 ‘ WITH RECURSIVE’中的‘RECURSIVE’我有一个疑问

 WITH RECURSIVE test AS (
	SELECT 1 AS n
	UNION ALL
	SELECT 1+n FROM test WHERE n < 10 
)
SELECT * FROM test ;

老师,为什么在公共表达式中 加了 UNION ALL 然后后面跟上 SELECT 1+n FROM test WHERE n < 10 就可以做循环了呢?
当我把SQL语句改成这样时就值调用了一次

 WITH RECURSIVE test AS (
	SELECT 1 AS n
)
SELECT * FROM test ;

之前对UNION ALL的理解是可以将表和表的数据做合并,但是为什么可以在公共表达式中做无限循环。。

正在回答

1回答

这是一种嵌套调用,你有没有发现在Union all中引用了with定义的临时表。

0 回复 有任何疑惑可以回复我~
  • 提问者 ericdemon #1
    老师,AS中的内容我是这样理解的
    1. 首先 `SELECT 1 AS n` 返回的结果集1当做n
    2. 然后调用`test`临时表,过滤条件是n 小于10 ,然后返回结果集是1+n = 2 
    3.  两条结果合并
    但是我想不到循环的逻辑是在哪里,还是说我理解错了‘RECURSIVE ’的意思,其实应该是如果`where`的过滤条件判断为真的话,是继续执行下去?
    回复 有任何疑惑可以回复我~ 2019-08-06 20:11:09
  • sqlercn 回复 提问者 ericdemon #2
    这不是循环而是嵌套,也就是说在条件允许的情况下会重复n+1
    回复 有任何疑惑可以回复我~ 2019-08-07 20:12:59
  • 提问者 ericdemon 回复 sqlercn #3
    老师,我好想有点明白什么意思了,其实就是引用自己无限递归下去。
    第一层合并的是1和2,第二层是2和3,直到n = 10的时候,没有满足条件就不再继续引用自身了,自然而然的就结束了递归,然后将这些结果通过UNION ALL做合并,最终就得到了结果
    回复 有任何疑惑可以回复我~ 2019-08-07 23:15:51
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信