`
zjcheng
  • 浏览: 91965 次
  • 性别: 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
分享到:
评论

相关推荐

    ORACLE查询树型关系(connect_by_prior_start_with)

    从 Oracle 9i 开始,可以通过 SYS_CONNECT_BY_PATH 函数实现将父节点到当前行内容以“path”或者层次元素列表的形式显示出来。 使用 START WITH 和 CONNECT BY 子句,可以 select 数据具有层次关系的数据,通常是...

    oracle sys_connect_by_path 函数 结果集连接

    Oracle的`sys_connect_by_path`函数是一个非常有用的工具,尤其在构建树状结构的数据时。在本文中,我们将深入理解这个函数以及如何将其应用于非树结构的数据以生成所需的结果。 `sys_connect_by_path`函数的基本...

    Oracle递归树形结构查询功能

    `sys_connect_by_path`函数与`CONNECT BY`配合使用,可以追踪节点在整个树中的路径。例如,它可以将每个节点的路径作为字符串返回,便于理解和分析树结构。 在实际应用中,例如组织结构的展示,我们可以创建一个...

    oracle connect by level 应用

    `CONNECT BY`还可以结合`SYS_CONNECT_BY_PATH`函数,用于返回从起始节点到当前节点的路径。例如,我们可以添加一个路径列来显示每个员工的晋升路径: ```sql SELECT EMPLOYEE_NAME, MANAGER_NAME, SYS_...

    Oracle的Connect By使用示例

    SELECT LTRIM(SYS_CONNECT_BY_PATH(ID, '-'), '-') AS PATH, ID, NAME, LEVEL FROM TBL_TEST START WITH id = 1 CONNECT BY PRIOR id = pid; ``` - **解释**:利用`SYS_CONNECT_BY_PATH`函数构建出每条记录的...

    oracle-tree-sql.rar_oracle

    理解并熟练掌握`CONNECT BY`、`PRIOR`、`sys_connect_by_path`等关键字和函数,可以帮助我们更高效地处理树形结构的数据。在实际应用中,还需要考虑性能优化,如合理设计表结构和使用索引,以确保查询的效率。

    【Oracle】树状结构查询

    SELECT LEVEL, CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF, SYS_CONNECT_BY_PATH(a.ename, '/'), a.* FROM empa WHERE a.empno <> 7369 START WITH a.empno = 7839 CONNECT BY NOCYCLE PRIOR a.empno = a.mgr; ``` ...

    oracle多行合并一行

    2. **使用`SYS_CONNECT_BY_PATH`函数**:该函数可以递归地遍历每一组中的所有记录,并生成一个由逗号连接的字符串。 3. **使用`ROW_NUMBER()`与`PARTITION BY`结合**:再次使用`ROW_NUMBER()`函数,并结合`PARTITION...

    Oracle 树操作(SQL查询成树菜单)

    SELECT SYS_CONNECT_BY_PATH(name, '/') AS path FROM test_tree WHERE id = 2 CONNECT BY PRIOR id = parent; ``` #### 五、结论 通过上述介绍和示例,我们可以看到Oracle中的树查询功能非常强大,能够满足...

    Oracle_hierarchical_SQL_查询应用

    自Oracle 9i版本开始,`SYS_CONNECT_BY_PATH`函数被引入,用于追踪从根节点到当前行的完整路径。在SQL1.3中,这个函数将每个地区的完整路径以斜线分隔的形式返回。例如,路径`/Asia/China/Beijing`表示从亚洲开始,...

    Oracle 树操作(SQL查询成树状菜单)

    - SQL语句: `SELECT SYS_CONNECT_BY_PATH(name, '/') FROM test_tree t START WITH t.id = 1 CONNECT BY PRIOR t.id = t.parent_id;` - 解释: 查询指定节点(如1)及其所有子节点的名称路径。`SYS_CONNECT_BY_PATH...

    sql实现多行合并一行

    `CONNECT BY`用于建立树形连接,而`SYS_CONNECT_BY_PATH`则可以沿着这些连接路径收集数据。 以下是一个详细的步骤解释: 1. 使用`ROW_NUMBER () OVER (PARTITION BY…)`对每个股票代码创建组内序号。这是为了后续...

    Oracle中分组后拼接分组字符串.pdf

    最后,我们使用 `sys_connect_by_path()` 函数来拼接分组后的数据,并使用 `start with` 子句和 `connect by` 子句来实现递归操作: ```sql select No, ltrim(max(sys_connect_by_path(Value, ';')), ';') as ...

    Oracle树查询及相关函数

    除了基本的查询语法,Oracle还提供了一些辅助函数来处理树结构,如`SYS_CONNECT_BY_PATH`可以返回节点在整个树路径中的位置,`LEVEL`返回节点在树中的深度,`CONNECT_BY_ROOT`则用于获取树的根节点。 在进行树查询...

    Oracle树查询总结

    Oracle 数据库在处理树形数据结构时,提供了一种强大的查询方法,即 `SELECT...START WITH...CONNECT BY...PRIOR` 语法。这种查询模式允许我们以递归方式遍历和检索具有层级关系的数据,例如组织结构、产品分类或者...

    oracle查询成树状

    - **利用`SYS_CONNECT_BY_PATH`函数**:可以生成路径字符串,常用于展示完整路径信息,例如`SELECT SYS_CONNECT_BY_PATH(name, '/') AS path`。 ### 总结 通过结合`START WITH`和`CONNECT BY`子句,Oracle数据库...

    Oracle 数据库特殊查询总结

    1. 查询本节点及本节点以下的所有节点: ...SELECT RPAD( ' ', 2*(LEVEL-1), '-' ) || DEPNAME "DEPNAME",CONNECT_BY_ROOT DEPNAME "ROOT",CONNECT_BY_ISLEAF "ISLEAF",LEVEL ,SYS_CONNECT_BY_PATH(DEPNAM

    oracle10g,9i多行合并一行函数

    这里介绍一种使用`sys_connect_by_path()`函数结合`connect by`语法的方法。 **示例代码:** ```sql SELECT name, MAX(REPLACE(SUBSTR(sys_connect_by_path(course, '*'), 2), '*', ';')) AS courses FROM ( ...

Global site tag (gtag.js) - Google Analytics