`
keepwork
  • 浏览: 334457 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle--递归查询

 
阅读更多

开发者博客www.developsearch.com

 

CONNECT BY 递归查询树形结构关系

命令格式如下:
SELECT ….. CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 列名2}
[START WITH];
其中:CONNECT BY子句说明每行资料将是按层次顺序检索,并规定将表中的资料连入树形结构的关系中。
0PRIORY运算符必须放置在连接关系的两列中的某一个的前面。对于节点间的父子关系,PRIOR去处符在一侧表示父节点,
在别一侧表示子节点,从而确定查找权结构的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,
还允许使用列运算式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。
例子:

从Root往树末梢递归 

select * from TBL_TEST
 start with id=1
 connect by prior id = pid

 从末梢往树ROOT递归

select * from TBL_TEST
 start with id=5
 connect by prior pid = id

可通过level 关键字查询所在层次 

select a.*,level from TBL_TEST
start with id=1
 connect by prior id = pid 

通过子节点获得顶节点

select FIRST_VALUE(deptid) OVER (ORDER BY LEVEL DESC ROWS UNBOUNDED PRECEDING) AS firstdeptid 
from persons.dept start with deptid=76 connect by prior paredeptid=deptid  

下拉中用数据源取年份时,可用如下方式写:
select * from
(select rownum,to_char(add_months(sysdate, 4), 'yyyy') - rownum
from dual connect by rownum<5);

 

递归删除树节点

/**
	 * 递归删除所有子节点
	 */
	public void removeNode(Long areaId){
        List<Object> args = new ArrayList<Object>();
        args.add(areaId);
        
		StringBuffer sql = new StringBuffer("");
		sql.append(" delete from CDH_NEWRBT_AREA t where t.area_id in ");
		sql.append(" ( ");
		sql.append(" 	select a.area_id from CDH_NEWRBT_AREA a ");
		sql.append(" 	start with a.area_id = ? ");
		sql.append(" 	connect by prior  a.area_id = a.parent_id");
		sql.append(" ) ");
		log.info(sql.toString());
        
        this.executeUpdateSql(sql.toString(), args);
    }
	
	public int executeUpdateSql(final String sql, final List<Object> args){
        return (Integer)getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException {
                Query query = session.createSQLQuery(sql);
                if (args != null && args.size() > 0) {
                    Object[] values = args.toArray();
                    for (int i = 0; i < values.length; i++) {
                        query.setParameter(i, values[i]);
                    }
                }                
                return query.executeUpdate();
            }
        });    
    }

 

 

 

分享到:
评论

相关推荐

    oracle-递归查询地区名称

    oracle 递归调用 地区 ,用到的方法是 SYS_CONNECT_BY_PATH,可以扩展层级 名称

    oracle递归、迭代

    ### Oracle中的递归查询详解 #### 一、引言 在数据库管理中,处理具有层次结构的数据是一项常见的任务。例如,在组织结构、产品分类或文件系统等场景中,经常需要查询这种类型的层级数据。Oracle数据库提供了强大...

    Oracle中的树状查询(递归查询)

    Oracle数据库系统在处理层次数据或树形结构时,提供了强大的工具——递归查询。递归查询允许我们在数据表中处理嵌套级别的数据,这在权限查询、组织结构、产品分类等场景中尤其常见。本文将深入探讨Oracle中的树状...

    Oracle递归树形结构查询功能

    Oracle数据库在处理树形结构数据时提供了强大的递归查询功能,这种特性对于组织结构、产品分类、层级菜单等场景的应用非常广泛。递归树形结构查询主要依赖于`CONNECT BY`和`PRIOR`关键字,它们允许我们构建复杂的...

    递归查询菜单树,支持mysql,oracle

    这里,我们将深入探讨如何使用递归查询来构建菜单树,并特别关注在MySQL和Oracle这两种广泛使用的数据库系统中的实现。 首先,我们要理解什么是递归查询。递归查询是一种在数据库中处理层次数据的方法,它通过自身...

    Oracle递归SQL学习

    这是Oracle递归查询的关键部分。`connect by`子句定义了层次之间的连接规则。在这里,`prior`关键字用来引用上一层的值,即父节点的`parent_id`应该等于当前行的`id`,这样我们就沿着父到子的方向遍历树。 3. `...

    oracle递归查询的例子

    ### Oracle 递归查询详解及实例 #### 一、引言 在数据库查询语言中,Oracle 提供了一种强大的功能——递归查询,这在其他数据库系统如 SQL Server 中是缺失的功能。递归查询允许用户执行多级关联查询,特别适用于...

    Oracle 递归函数介绍

    Oracle 递归函数是一种特殊的PL/SQL函数,可以用于解决复杂的树形结构查询问题。递归函数可以自我调用,以便遍历树形结构的每个节点,直到达到停止条件。 在 Oracle 中,递归函数的定义语法如下所示: ```sql ...

    oracle递归查询向上向下.txt

    oracle递归查询

    Oracle递归查询

    ### Oracle递归查询详解 #### 一、引言 在处理具有层级结构的数据时,递归查询是一项非常有用的技能。例如,在处理组织架构、产品分类等数据时,我们经常需要查询某一节点及其所有子节点或者从某个节点追溯到其根...

    递归查询父子关系记录 oracle

    oracle 如何递归查询父子关系。经常用于构造树结构

    数据库设计之递归树查询

    以下是在Oracle中进行递归查询的例子: ```sql SELECT id, name, CONNECT_BY_ROOT id AS root_id FROM employees START WITH id = some_employee_id CONNECT BY PRIOR id = manager_id; ``` 六、注意事项与优化 1....

    Oracle 11GR2的递归WITH子查询方法

    Oracle 11GR2的递归WITH子查询是一种强大的功能,它允许你在SQL查询中创建递归关系,处理层级数据,比如组织结构、家族树或依赖关系等。WITH子查询,也称为公共表表达式(CTE),是SQL标准的一部分,自9i版本开始被...

    oracle-tree-sql.rar_oracle

    在Oracle数据库中,树结构查询是一种常见的数据操作方式,特别是在处理层次关系的数据时。Oracle提供了一种称为“连接查询”(Connect By)的特有语法,使得我们可以方便地对具有层级关系的数据进行检索。本资料...

    Oracle-错误一览表.doc

    10. **A-00036**: 超过递归SQL的最大深度,通常发生在复杂的嵌套查询或存储过程中。 11. **A-00054**: 资源正忙,并且请求了NOWAIT选项,这意味着操作无法立即完成,因为资源被其他事务占用。 12. **A-00056**: ...

    在db2和oracle中的对树的递归查询语句

    在Oracle中,对树的递归查询主要依赖于`CONNECT_BY`功能。`CONNECT_BY`是Oracle SQL的一个扩展,用于处理层次查询。它允许我们通过指定的连接条件来遍历层级数据,从而进行递归查询。例如,我们可以用以下方式查询一...

    dhtmlx tree 使用,与oracle递归查询的结合

    描述中提到,使用Oracle递归查询比在程序中实现递归查询速度更快。这是因为数据库系统通常针对这类操作进行了优化,能够更高效地处理层次结构数据。此外,数据库可以利用索引和其他优化技术,提高查询速度。而在应用...

    oracle-OCP教程中文版

    1. **高级SQL**:深入学习SQL的高级特性,如窗口函数、集合操作和递归查询。 2. **数据库安全**:理解Oracle的权限和角色管理,以及如何设置用户权限、审计和加密。 3. **数据库复制**:了解Oracle的复制技术,如...

    oracle-sql.ppt

    13. **高级SQL特性**:Oracle SQL还包括窗口函数、集合操作、递归查询等高级特性,这些可能在后续章节中被详细探讨。 通过这个23章的PPT学习,读者将能够熟练地运用Oracle SQL进行数据库操作,理解其背后的逻辑,并...

    MySQL多种递归查询方法.docx

    #### 一、Oracle中的递归查询方法 在Oracle数据库中,递归查询可以通过`START WITH CONNECT BY PRIOR`语句实现。此语句允许用户按照树状结构来检索数据。 ##### 1. `START WITH CONNECT BY PRIOR`用法详解 **基本...

Global site tag (gtag.js) - Google Analytics