理解KingbaseES中的递归查询

本文深入介绍了KingbaseES中递归查询的概念,特别是通过公用表表达式(CTE)实现递归。讨论了递归查询的语法、处理方式,与PL/SQL递归查询的差异,并提供了员工层级结构和斐波那契数列的示例,揭示了递归查询在处理层次数据和复杂计算方面的强大能力。
摘要由CSDN通过智能技术生成
  1. 概述
    递归查询能够完成在 SQL 中无法实现的操作。
    本文通过示例对递归查询进行了简单介绍,并展示了与PL/SQL的递归查询实现的差异。
  2. 公用表表达式(WITH子句)
    公用表表达式(CTE)可以被看作是一个视图,只适用于一个单一的查询:
    WITH ctename AS (
    SELECT …
    )
    SELECT …
    FROM ctename …
    这也可以写成 中的子查询FROM,但使用 CTE 有如下优点:
     查询变得更具可读性。
     您可以在查询中多次引用CTE,并且只会计算一次。
     您可以在 CTE 中使用数据修改语句(通常带有RETURNING子句)。
    请注意,在KingbaseES V8R3中,总是物化CTE。这意味着,CTE是独立于包含查询计算的。从KingbaseES V8R6开始,CTE 可以“内联”到查询中,这提供了进一步的优化潜力。
  3. 递归查询的语法
    递归查询是使用递归CTE编写的,即包含RECURSIVE关键字的CTE :

WITH RECURSIVE ctename AS (
SELECT /* non-recursive branch, cannot reference “ctename” /
UNION [ALL]
SELECT /
recursive branch referencing “ctename” */
)
SELECT …
FROM ctename …
4. 如何处理递归查询
KingbaseES内部使用工作表来处理递归 CTE。这种处理并不是真正的递归,而是迭代:
首先,通过执行 CTE 的非递归分支来初始化工作表。CTE 的结果也用这个结果集初始化。如果递归 CTE 使用UNION而不是UNION ALL,则删除重复的行。
然后,KingbaseES重复以下操作,直到工作表为空:
 评估 CTE 的递归分支,用工作表替换对 CTE 的引用。
 将所有结果行添加到 CTE 结果。如果UNION用于合并分支,则丢弃重复的行。
 用上一步中的所有新行替换工作表(不包括任何已删除的重复行)。
请注意,到目前为止,CTE的自引用分支并未使用完整的 CTE 结果执行,而是仅使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值