前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >oracle中如何优雅的递归查询

oracle中如何优雅的递归查询

原创
作者头像
西门呀在吹雪
修改2021-08-31 15:35:03
10.8K1
修改2021-08-31 15:35:03
举报
文章被收录于专栏:架构之巅

一条sql怎么查出单表中含有父子关系的数据呢?

代码语言:javascript
复制
WITH tab AS (
	SELECT
		'1' AS id,
		'0' AS parid,
		'广东' AS name 
	FROM
		dual UNION
	SELECT
		'2' AS id,
		'0' AS parid,
		'广西' AS name 
	FROM
		dual UNION
	SELECT
		'3' AS id,
		'1' AS parid,
		'广州' AS name 
	FROM
		dual UNION
	SELECT
		'4' AS id,
		'3' AS parid,
		'荔湾区' AS name 
	FROM
		dual UNION
	SELECT
		'5' AS id,
		'3' AS parid,
		'黄浦区' AS name 
	FROM
		dual UNION
	SELECT
		'6' AS id,
		'2' AS parid,
		'桂林' AS name 
	FROM
		dual UNION
	SELECT
		'7' AS id,
		'6' AS parid,
		'阳朔' AS name 
	FROM
		dual 
	) SELECT
	tab.id,
	sys_connect_by_path ( tab.name, '\' ) 
FROM
	tab 
WHERE
	LEVEL = 3 CONNECT BY PRIOR tab.id = tab.parid

还有其他更优雅的写法吗?有的 start with xxx connect by prior t.parent=t.id

代码语言:javascript
复制
select parent,id,level from tableName  
start with id='370883101000' connect by prior parent=id

start with子句: 递归的条件,需要注意的是如果with后面的值是子节点那么求出的就是他的父节点和祖宗节点,如果是父节点那么求出的就是他的子节点和子孙节点,如果不懂可以把上面start with 后面的条件改成 p.parent=0,就可以理解了。

connect by子句:连接条件。 关键词prior,prior跟它右边的父节点放在一起(prior p.parent)表示往父节点方向遍历, 反之,如果 prior跟子节点放在一起(prior p.id)表示往叶子方向遍历。 这里需要注意的 =p.id 放在prior关键词的前面或者后面都没什么关系,也就是上面可以这样写 p.id= prior p.paren。重要的是prior旁边放的

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档