对于 SQL 递归 CTE,为什么它不在每次 'loops' 时再次引用锚成员?为什么主播会员只获得一次'called'?

For SQL Recursive CTEs, why doesn't it reference the anchor member again each time it 'loops'? Why does the anchor member only gets 'called' once?

我正在 https://www.essentialsql.com/recursive-ctes-explained/

上查看 cte explnation

以及视觉解释:https://277dfx2bm2883ohl6u2g3l59-wpengine.netdna-ssl.com/wp-content/uploads/2016/07/Parts-of-A-Recursive-Common-Table-Expression-1024x357.png

不会再次调用主播成员创建不必要的线路吗?

如果我对你的问题的理解正确,我认为你假设递归 CTE 的行为应该是语法的自然结果 - 它说 "UNION",所以它应该表现得像一个普通的联合, 并为每次迭代重新执行。

但这并不是 SQL 的实际工作方式:递归 CTE 的行为方式是因为规范规定它们应该这样做。语法可以使用不同的关键字来代替,例如 WITH RECURSIVE foo AS (ANCHOR=(SELECT blah...) CONTINUATION=(SELECT whatever...) UNIQUEROWS=TRUE) 并且语言定义会简单地说 "execute the anchor once, and the continuation multiple times, then remove duplicates if required".

语言设计者喜欢为相似的概念重用关键字,因为这意味着更少的保留字,并帮助用户记住一些概念,例如 UNION vs UNION ALL,但这并不意味着关键字意味着完全一样的东西在不同的场景下。在递归 CTE 的情况下,由 UNION 连接的两个表达式实际上是单独的锚点和延续表达式,就像我上面想象的语法一样; UNION 关键字只是用来分隔它们,您可以将其更改为 UNION ALL 以关闭重复数据删除步骤。