【问题标题】: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?对于 SQL 递归 CTE,为什么每次“循环”时不再次引用锚成员?为什么锚成员只被“调用”一次?
【发布时间】:2018-06-29 14:38:08
【问题描述】:

【问题讨论】:

标签: mysql sql sql-server recursion recursive-query


【解决方案1】:

如果我理解你的问题是正确的,我认为你假设递归 CTE 的行为应该是语法的自然结果 - 它说“UNION”,所以它的行为应该像一个正常的联合,并且是- 为每次迭代执行。

但这并不是 SQL 真正的工作方式:递归 CTE 的行为方式是它们的行为方式,因为规范规定它们应该这样做。语法可以使用不同的关键字,例如WITH RECURSIVE foo AS (ANCHOR=(SELECT blah...) CONTINUATION=(SELECT whatever...) UNIQUEROWS=TRUE),语言定义会简单地说“执行一次锚点,多次执行,然后在需要时删除重复项”。

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

【讨论】:

  • 好吧,我想我必须接受它的现状并继续前进……有时我会想太多,我会像 Python/MATLAB 代码一样“单步执行”它
  • 正如我仍然不明白为什么它的行为如此而不必运行锚成员的复制...
  • @DCH SQL 不是设计最精美的语言,它的某些语法有点不合逻辑。至于“逐步执行”,想象一下“union”关键字是“while”循环的开始:之前的代码执行一次,之后的代码执行零到多次。除了“因为它有用”之外,真的没有“为什么”。
猜你喜欢
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 2021-11-25
相关资源
最近更新 更多