版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gang950502/article/details/81302045
db2 with语法和递归
1. 创建测试表
CREATE TABLE someplace
(
ID INTEGER NOT NULL PRIMARY KEY,
ParentID INT,
NAME VARCHAR(100)
);
INSERT INTO someplace VALUES(001,null,'陕西省');
INSERT INTO someplace VALUES(002,001,'商洛市');
INSERT INTO someplace VALUES(003,001,'西安市');
INSERT INTO someplace VALUES(004,001,'咸阳市');
INSERT INTO someplace VALUES(005,002,'商州区');
INSERT INTO someplace VALUES(006,003,'雁塔区');
INSERT INTO someplace VALUES(007,004,'三原县');
INSERT INTO someplace VALUES(008,005,'商洛学院');
INSERT INTO someplace VALUES(009,006,'科技二路');
INSERT INTO someplace VALUES(010,005,'莲湖公园');
INSERT INTO someplace VALUES(011,005,'中心广场');
INSERT INTO someplace VALUES(012,004,'李靖故居');
INSERT INTO someplace VALUES(013,002,'428');
INSERT INTO someplace VALUES(014,009,'清华软件园');
commit;
- 查看数据
select * from user1.someplace;
2. 改成with查询语句
with data(id,parentid,name) as
(select id,parentid,name from someplace)
select id,parentid,name from data;
- 查看结果:
with语法可实现简单的select查询,有时会遇到对同一数据集多次操作,那么with语法就相当适合
,例如以下的查询
with data(id,parentid,name) as
(select id,parentid,name from someplace)
select id,parentid,name from data where id = 5
union
select id,parentid,name from data where id = 6;
查看结果:
3. 递归的使用
3.1 查找根节点下的所有叶节点
with data(id,parentid,name) as
(select id,parentid,name from someplace where parentid is null -- 选择根节点
union all
select child.id,child.parentid,child.name from someplace child,data
where child.parentid = data.id-- 递归条件
)
select id,parentid,name from data ;
查看结果:
3.2 查看某个叶节点下的所有节点
with data(id,parentid,name) as
(select id,parentid,name from someplace where id = 5 -- 选择根节点
union all
select child.id,child.parentid,child.name from someplace child,data
where child.parentid = data.id-- 递归条件
)
select id,parentid,name from data ;
查看结果
这里可以看到成功获取到了节点5本身和向下的所有节点