求个SQL

LakersLebron23 2019-09-04 02:37:38
oracle 表里3个字段 一个ID 一个NAME 一个PARENTID
里边的4条数据NAME存的是 世界 亚洲 中国 北京 PARENTID 为世界的为null 其他的依次为以上关系所示
想要达到的效果 当我查到世界 显示世界
查到亚洲 显示 世界-亚洲
查到中国 显示 世界-亚洲-中国
以此类推 求解怎么写
...全文
232 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
AHUA1001 2019-09-06
  • 打赏
  • 举报
回复
没有你的表,就新建了一个临时表T1。 WITH T1 AS ( SELECT '世界ID' ID,'世界' NAME,NULL PARENTID FROM DUAL UNION ALL SELECT '亚洲ID' ID,'亚洲' NAME,'世界ID' PARENTID FROM DUAL UNION ALL SELECT '中国ID' ID,'中国' NAME,'亚洲ID' PARENTID FROM DUAL UNION ALL SELECT '北京ID' ID,'北京' NAME,'中国ID' PARENTID FROM DUAL ), T2 AS (SELECT LISTAGG(NAME,'-') WITHIN GROUP (ORDER BY LEVEL DESC) NAMES FROM T1 START WITH NAME = '中国' -- 这里查询中国,就是中国及以上的内容。查询北京,就是北京及以上的内容。 CONNECT BY ID = PRIOR PARENTID ORDER BY LEVEL DESC) SELECT * FROM T2 ;
LakersLebron23 2019-09-06
  • 打赏
  • 举报
回复
引用 6 楼 stelf 的回复:
SYS_CONNECT_BY_PATH 了解一下
谢谢! 好用了!
stelf 2019-09-05
  • 打赏
  • 举报
回复
SYS_CONNECT_BY_PATH 了解一下
LakersLebron23 2019-09-05
  • 打赏
  • 举报
回复
引用 3 楼 Wazy_csdn 的回复:
我是想通过查一个ID然后直接查到头, 然后再把名字按从高到低拼接起来 , 就比如我通过中国的id 我得到的结果是 世界-亚洲-中国 这样的一个结果
nayi_224 2019-09-04
  • 打赏
  • 举报
回复
with tab1 as (
select level id, nullif(level, 1) - 1 parent_id from dual connect by level < 6
)
select listagg(t1.id, '-') within group(order by level desc)
  from tab1 t1
 start with t1.id = &start_id
connect by prior t1.parent_id = t1.id
;
Wazy_csdn 2019-09-04
  • 打赏
  • 举报
回复
oracle_awen 2019-09-04
  • 打赏
  • 举报
回复
可以参考杨廷琨写的高效SQL语句编写文档
oracle_awen 2019-09-04
  • 打赏
  • 举报
回复
可以增加ID列,然后通过start with…connect by…prior语法获取。 要不然写的SQL非常丑,或者通过函数去遍历

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧