`
zjcheng
  • 浏览: 88431 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle数据库树形菜单统计(connect by prior,sys_connect_by_path)

阅读更多
最近在工作中需要统计系统各个菜单的访问情况,这些情况可以从用户访问的日志表中获取。由于整个系统树形菜单ID不是按照某种规律设计的,父子菜单在菜单Id上没有什么规律,所以要统计各菜单的访问量时SQL不好写(本人目前的SQL书写能力不是很好啊),费了很大的周折,发现原来Oracle数据提供了一种查询树形菜单的SQL。在这做个笔记,主要是用到了一下的
select * --此处可以组合要查的内容,比如我就想查当前菜单的根节点是谁
  from table_name(0) t
start with t.id(1) = &menuRoot(2)
connect by prior t.id(1) = t.p_id(3)
其中(0)是菜单表,(1)是菜单ID,(2)是你想起始的菜单ID,(3)是菜单父ID。这种写法是从上之下的查找。把connect by prior t.id(1) = t.p_id(3)
换成connect by prior t.p_id(3) = t.id(1)
则是从下往上查找,即从子节点查父节点。
期间用到一个函数,sys_connect_by_path(),可以拼出想要的路径信息。
我用的SQL如下:
select t.*,
       SYS_CONNECT_BY_PATH(t.module_name, '->') pathDesc,
       substr(sys_connect_by_path(t.module_id, '$') || '$',
              2,
              instr(sys_connect_by_path(t.module_id, '$') || '$', '$', 1, 2) - 2) p_id
  from oas.sc_menu t
start with t.parent_id = 'kb_menu_root'   
connect by prior t.module_id = t.parent_id
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics