H2数据库递归语法

-- 创建模块表
create table module (
        sid number(10) not null, 
        module_name varchar2(20) not null, 
        pid number(10)
);
-- 插入数据
insert into module(sid, module_name, pid) values (1, '模块1', null);
insert into module(sid, module_name, pid) values (2, '模块2', null);
insert into module(sid, module_name, pid) values (3, '模块3', null);
insert into module(sid, module_name, pid) values (4, '模块21', 2);
insert into module(sid, module_name, pid) values (5, '模块31', 3);
insert into module(sid, module_name, pid) values (6, '模块211', 4);
insert into module(sid, module_name, pid) values (7, '模块11', 1);
insert into module(sid, module_name, pid) values (8, '模块111', 7);
insert into module(sid, pid, module_name) values(9, 3,  '模块32');
-- 从头节点开始递归遍历
with tree(sid, pid, name) as (
        select m.sid, m.pid, m.module_name from module m where m.pid is null
        union all
        select m2.sid, m2.pid, m2.module_name 
                from tree inner join module m2 on tree.sid = m2.pid
) select * from tree order by sid;
-- 从指定节点开始递归遍历
with tree(sid, pid, name) as (
        select m.sid, m.pid, m.module_name from module m where m.sid = 2
        union all
        select m2.sid, m2.pid, m2.module_name 
                from tree inner join module m2 on tree.sid = m2.pid
) select * from tree order by sid;

-- 从叶节点开始方向递归遍历,注意distinct
with tree(sid, pid, name) as (
        select m.sid, m.pid, m.module_name from module m where m.sid in (5,6,8, 9)
        union all
        select distinct  m2.sid, m2.pid, m2.module_name 
                from tree inner join module m2 on tree.pid = m2.sid
) select * from tree order by sid;
-- 查询指定层级上的节点,先要遍历全部
with tree(sid, pid, name, level) as (
        select m.sid, m.pid, m.module_name, 0 from module m where m.pid is null
        union all
        select m2.sid, m2.pid, m2.module_name, tree.level + 1 
                from tree inner join module m2 on tree.sid = m2.pid
) select * from tree where level = 1 order by sid;
-- 注意with as...后只支持select语句,不支持如下级联删除
with tree(sid, pid, name) as (
        select m.sid, m.pid, m.module_name from module m where m.sid = 2
        union all
        select m2.sid, m2.pid, m2.module_name 
                from tree inner join module m2 on tree.sid = m2.pid
) delete from module where sid in (select sid from tree);

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java小卷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值