with recursive as实现递归

with as

with as相信大家都会用,用于创建临时表达式CTE(我理解为临时表),方便在后续代码中引用它,是的代码看起来更加简洁,且逻辑更清晰。

with tmp1 as(
    select  * from table1 ...
)
,tmp2 as(
    select  * from tmp1 ...
)


INSERT OVERWRITE TABLE bigtable

select * from tmp1
union all
select * from tmp2

with recursive as

with recursive as是一个用于创建递归查询的语句。它允许你定义一个 Common Table Expression (CTE),该 CTE 可以引用自身的输出。递归 CTE 非常适合于查询具有层次结构或树状结构的数据,例如组织结构、文件系统或任何其他具有自引用关系的数据。

基本语法

with recursive cte_name (column1,column2,...) as
(
    -- 非递归的初始部分,定义了 CTE 的起点
    select ... from   
    
    union all
    
    -- 递归部分,可以引用 CTE 的别名
    select ... from cte_name 
    where ...
)
select * from cte_name;

例1:递归获得递增的序列

with recursive cte(n) as
(
    select 1
    union all
    select n+1 from cte where n<5
)
select * from cte;


结果:
n
----
1
2
3
4
5

例2:查找树形结构所有员工及其上级经理

with recursive employee_hierarchy (id,name,manager_id,path) as
(
    -- 非递归的初始部分,查找顶层经理
    select id,name,manager_id,concat(name,'/') as path 
    from  employee
    where manager_id is null
    
    union all
    
    -- 递归部分,查找顶层经理的所有下属
    select e.id,e.name,e.manager_id,concat(e.name,'/',eh.path) as path  --将当前员工添加到路径中
    from employee e
    inner join  employee_hierarchy eh on e.manager_id=eh.id
)
select * from cte_name;


employee
id  |  name  |  manager_id
100     A           null
101     A1          100
102     A2          100
103     A11         101

结果:
id  |  name  |  manager_id  |  path
100     A           null        A/
101     A1          100         A1/A
102     A2          100         A2/A
103     A11         101         A11/A1/A

WITH RECURSIVE cte AS是一种在SQL语句中使用递归的方式。它可以用来创建一个临时的递归表格,并在表格中进行递归操作。\[1\] 在这个语法中,cte是递归表格的名称,可以在后续的SQL语句中引用。递归表格的定义包括两部分:初始值和递归内容。初始值是指递归表格的初始行,而递归内容是指在每次递归时要添加到表格中的行。递归内容可以引用递归表格本身,以实现递归操作。 在递归表格的定义中,可以使用UNION ALL将初始值和递归内容组合在一起。递归内容中的WHERE子句用于指定递归的终止条件,以防止无限递归。 使用WITH RECURSIVE cte可以实现各种递归操作,例如计算累加和、查询层级关系等。\[3\] \[2\] 希望这个解释对您有帮助。 #### 引用[.reference_title] - *1* [SQL:With recursive 递归用法](https://blog.csdn.net/WHYbeHERE/article/details/125440856)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [WITH RECURSIVE 递归 与with as 子查询部分](https://blog.csdn.net/weixin_42871919/article/details/129436417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值