oracle树查询
SELECT R.RESOURCE_ID,R.RESOURCE_NAME,R.RESOURCE_URL,R.RESOURCE_TYPE,R.CREATE_TIME,R.STATUS
,RS.RESOURCE_STRUCTURE_ID,RS.RESOURCE_LEVEL,RS.PARENT_RESOURCE_ID,RS.RESOURCE_SORTNUMBER
FROM T_SYS_RESOURCE_STRUCTURE RS JOIN T_SYS_RESOURCE R ON R.RESOURCE_ID = RS.RESOURCE_ID
START WITH
<if test="resourceId != null and resourceId != ''">
RS.PARENT_RESOURCE_ID = #{resourceId}
</if>
<if test="resourceId == null or resourceId == ''">
RS.PARENT_RESOURCE_ID = '0'
</if>
CONNECT BY PRIOR RS.RESOURCE_ID=RS.PARENT_RESOURCE_ID
ORDER BY RS.RESOURCE_SORTNUMBER
mysql 存储过程实现
DROP PROCEDURE IF EXISTS `ResourcesTreeQuery`;
CREATE PROCEDURE `ResourcesTreeQuery`(paramId varchar(30))
BEGIN
create temporary table if not exists tmp_table(
RESOURCE_ID varchar(30),RESOURCE_NAME varchar(50),RESOURCE_URL varchar(200),RESOURCE_TYPE varchar(2),CREATE_TIME timestamp,STATUS varchar(2),RESOURCE_STRUCTURE_ID varchar(30),RESOURCE_LEVEL int,
PARENT_RESOURCE_ID varchar(30),RESOURCE_SORTNUMBER int
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET @@max_sp_recursion_depth = 99 ;
call ResourcesIterative(paramId);
select * from tmp_table
union SELECT R.RESOURCE_ID,R.RESOURCE_NAME,R.RESOURCE_URL,R.RESOURCE_TYPE,R.CREATE_TIME,R.STATUS
,RS.RESOURCE_STRUCTURE_ID,RS.RESOURCE_LEVEL,RS.PARENT_RESOURCE_ID,RS.RESOURCE_SORTNUMBER
FROM T_SYS_RESOURCE_STRUCTURE RS JOIN T_SYS_RESOURCE R ON R.RESOURCE_ID = RS.RESOURCE_ID
where RS.RESOURCE_ID=paramId;
drop temporary table if exists tmp_table;
END;
DROP PROCEDURE IF EXISTS `ResourcesIterative`;
CREATE PROCEDURE `ResourcesIterative`(paramId varchar(30))
BEGIN
declare tRESOURCE_ID varchar(30) character set utf8;
declare tRESOURCE_NAME varchar(50) character set utf8;
declare tRESOURCE_URL varchar(200) character set utf8;
declare tRESOURCE_TYPE varchar(2) character set utf8;
declare tCREATE_TIME timestamp;
declare tSTATUS varchar(2) character set utf8;
declare tRESOURCE_STRUCTURE_ID varchar(30) character set utf8;
declare tRESOURCE_LEVEL int;
declare tPARENT_RESOURCE_ID varchar(30) character set utf8;
declare tRESOURCE_SORTNUMBER int;
declare cur1 CURSOR FOR
select R.RESOURCE_ID,R.RESOURCE_NAME,R.RESOURCE_URL,R.RESOURCE_TYPE,R.CREATE_TIME,R.STATUS
,RS.RESOURCE_STRUCTURE_ID,RS.RESOURCE_LEVEL,RS.PARENT_RESOURCE_ID,RS.RESOURCE_SORTNUMBER
FROM T_SYS_RESOURCE_STRUCTURE RS JOIN T_SYS_RESOURCE R ON R.RESOURCE_ID = RS.RESOURCE_ID
where RS.PARENT_RESOURCE_ID=paramId
ORDER BY RS.RESOURCE_SORTNUMBER;
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tRESOURCE_ID = null;
OPEN cur1 ;
FETCH cur1 INTO tRESOURCE_ID,tRESOURCE_NAME,tRESOURCE_URL,tRESOURCE_TYPE,tCREATE_TIME,tSTATUS,tRESOURCE_STRUCTURE_ID,tRESOURCE_LEVEL,tPARENT_RESOURCE_ID,tRESOURCE_SORTNUMBER;
WHILE ( tRESOURCE_ID is not null ) DO
insert into tmp_table values(tRESOURCE_ID,tRESOURCE_NAME,tRESOURCE_URL,tRESOURCE_TYPE,tCREATE_TIME,tSTATUS,tRESOURCE_STRUCTURE_ID,tRESOURCE_LEVEL,tPARENT_RESOURCE_ID,tRESOURCE_SORTNUMBER);
call ResourcesIterative(tRESOURCE_ID);
FETCH cur1 INTO tRESOURCE_ID,tRESOURCE_NAME,tRESOURCE_URL,tRESOURCE_TYPE,tCREATE_TIME,tSTATUS,tRESOURCE_STRUCTURE_ID,tRESOURCE_LEVEL,tPARENT_RESOURCE_ID,tRESOURCE_SORTNUMBER;
END WHILE;
CLOSE cur1;
END;
commit;
以上为自上往下递归,自下往上递归,更改游标按照PARENT_RESOURCE_ID递归即可
分享到:
相关推荐
### Oracle Start With.Connect By Prior 子句实现递归查询 #### 概述 在Oracle数据库中,`Start With.Connect By Prior`子句是执行递归查询的一种强大工具,主要用于处理层次结构数据。这类数据通常存在于组织...
在Oracle数据库中,递归查询可以通过`START WITH CONNECT BY PRIOR`语句实现。此语句允许用户按照树状结构来检索数据。 ##### 1. `START WITH CONNECT BY PRIOR`用法详解 **基本语法**: ```sql SELECT * FROM ...
Oracle 查询树型关系是指使用 START WITH 和 CONNECT BY 子句来实现 SQL 的层次查询。从 Oracle 9i 开始,可以通过 SYS_CONNECT_BY_PATH 函数实现将父节点到当前行内容以“path”或者层次元素列表的形式显示出来。 ...
connect by:connect by是必须的,start with有些情况是可以省略的,或者直接start with 1=1不加限制 prior:prior关键字可以放在等号的前面,也可以放在等号的后面,表示的意义是不一样的,比如 prior id = pid,...
CONNECT BY子句通常配合START WITH子句使用,其中START WITH指定了递归的起点,而CONNECT BY用于定义父子关系。CONNECT BY子句中的PRIOR关键字用于表示层级之间的连接,它指向前一个步骤得到的列值。例如,如果当前...
5. **连接函数**:如 `CONNECT_BY_ROOT()`, `START WITH ... CONNECT BY`,用于构建复杂的层次查询。 除了这些基础函数,MySQL 和 Oracle 还支持大量的高级特性,例如窗口函数、递归查询、正则表达式等。在实际应用...
`START WITH`定义了开始节点(顶级菜单),`CONNECT BY`指定了递归连接条件(当前行的父菜单ID等于上一行的ID),而`level`表示菜单的深度。 在实际应用中,通常还需要创建相应的表结构来存储这些菜单数据。例如,`...
在IT行业中,数据库管理系统(DBMS)如Oracle和MySQL是至关重要的工具,广泛应用于数据存储、管理和处理。在Windows操作系统中,我们经常需要通过批处理(BAT)文件来执行启动和停止这些数据库服务的操作,特别是在...
Oracle的CONNECT BY用于构建层次查询,而在MySQL中可能需要递归的用户定义变量或JOIN操作。子查询在两个系统中语法也略有不同。 7. **事务控制**: Oracle和MySQL都支持事务,但语法上有一些差异。如Oracle使用...
- **显示当前连接用户**:Oracle中使用`SQL> show user`,MySQL中使用`mysql> connect`,但实际上,MySQL中应使用`mysql> whoami`或`mysql> select user();`来查看当前登录用户。 ### 表管理 - **查询当前所有的表...
本文将深入探讨如何通过递归查询来解决这类问题,并着重讲解使用`WITH`语句来实现递归查询的方法,适用于多种数据库系统,如MySQL、PostgreSQL、SQL Server等。 一、理解递归查询 递归查询是一种在数据库中遍历层级...
本文将详细介绍Oracle、MySQL以及SQL Server这三种常用数据库管理系统中的分页查询实现方法。 #### 一、Oracle 分页查询 在Oracle中实现分页查询主要依靠`ROWNUM`伪列,这是一种非常简单但功能强大的机制。下面将...
- 使用序列实现自增长,例如创建一个起始值为1000、步长为1的序列:`CREATE SEQUENCE myseq START WITH 1000 INCREMENT BY 1;` - 插入数据时,使用序列的`NEXTVAL`方法自动获取下一个值:`INSERT INTO STUDENT(ID,...
Oracle通过`START WITH ... CONNECT BY PRIOR`子句直接支持递归查询,而SQL Server 2005及以上版本则利用公共表表达式(CTE)的递归调用来实现。POSTgreSQL同样支持CTE子查询进行递归。这些数据库允许在SQL语句中...
在Oracle数据库中,WM_CONCAT是一个非常实用的聚合函数,用于将一组字符串连接成一个单一的字符串,类似于SQL Server中的STRING_AGG或MySQL中的GROUP_CONCAT。然而,Oracle官方并没有提供这个函数,它是一个第三方...
在IT行业中,数据库管理系统(DBMS)如MySQL、Oracle和SQL Server是企业级应用的核心组件。这些系统提供了数据存储、管理、查询以及分析等功能。在日常运维中,启动和停止数据库服务是常见的操作,这对于系统维护、...
7. 创建Oracle数据库链接(dblink),如`create public database link ecology connect to "sa" identified by "******" using 'dg4msql';`,这里的`ecology`是dblink的名称,`sa`是SQL Server数据库的用户名,`****...