`
fanjf
  • 浏览: 329515 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

在ORACLE、MSSQL、MYSQL中树结构表递归查询的实现方法

 
阅读更多

表recursion数据如下:
id       name       parentid
1       食品分类     -1
2       肉类              1
3       蔬菜类          1
4       产品分类     -1
5       保健品          4
6       医药              4
7       建筑              4
一 ORACLE中实现方法:
Oracle中直接支持,使用语句select * from tablename start with connect by
prior id(子层的列)=parentid(属于顶层的列)
语句说明:
start with 指定层次开始的条件,即满足这个条件的行即可以作为层次树的最顶层
connect by prior指层之间的关联条件,即什么样的行是上层行的子行(自连接条件)
实例:
select * from recursionstart with connect by prior >查询结果:
id       name       parentid
1       食品分类     -1
2       肉类              1
3       蔬菜类          1
二 MSSQL中的实现方法
在MSSQL中需要使用临时表和循环多次查询的方式实现.
创建函数:
create function GetRecursion(@id int)
returns @t table(
    id int,
    name varchar(50),
    parentid int
)
as
begin
    insert @t select * from recursion where >    while @@rowcount>0
        insert @t select a.* from recursion as a inner join @t as b
        on a.parentid=b.id and a.id not in(select id from @t)
return
end
使用方法:
select * from GetRecursion(4)
查询结果:
id       name       parentid
4       产品分类     -1
5       保健品          4
6       医药              4
7       建筑              4
三 MYSQL中的实现方法
查询语句:
select b.id,b.name,b.parentid from recursion as a, recursion as b where
a.id=b.parentid and (a.id=1 or a. parentid =1)
查询结果:
id       name       parentid
2       肉类             1
3       蔬菜类         1
四 在ORACLE、MSSQL、MYSQL中可以使用下面的查询语句只返回树结构表的子结点数据
select *
  from tablename t
 where not exists (select 'X'
          from tablename t1, tablename t2
         where t1.id = t2.parentid
           and t1.id = t.id)
如:
select *
  from recursion t
 where not exists (select 'X'
          from recursion t1, recursion t2
         where t1.id = t2.parentid
           and t1.id = t.id)
查询结果:
id       name       parentid
2       肉类             1
3       蔬菜类         1
5       保健品         4
6       医药             4
7       建筑             4
五 在ORACLE、MSSQL、MYSQL中可以使用下面的查询语句只返回树结构表的根结点数据
select *
  from tablename t
 where not exists (select 'X'
          from tablename t1, tablename t2
         where t1.id = t2.parentid
           and t1.id = t. parentid)
如:
select *
  from recursion t
 where not exists (select 'X'
          from recursion t1, recursion t2
         where t1.id = t2.parentid
           and t1.id = t. parentid)
查询结果:
id       name       parentid
1       食品分类    -1
4       产品分类    -1

 

关于第四,五两点的意义,其实不是很大:

(1)首先,既然是自己建树结构的表,那么对于每颗树的根节点的父节点,一般都会有统一的值,如全部存储:null,0,-1等。其实定义成统一的值,它的好处不言而喻:规范表的数据值;增加可读性,可维护性等。

本例中就是统一存放的-1。 所以没有必须再采用子查询方式,取得树的所有子节点或者所有根节点。


(2)not exists 虽然也能命中索引,但是个人觉得仍然没有通过 parentid = -1 or parentid !=-1 查询的速度快。

分享到:
评论

相关推荐

    在ORACLE、MSSQL、MYSQL中树结构表递归查询的实现.pdf

    在数据库系统中实现树结构表递归查询是一种常见的需求,它允许我们查询出具有层级关系的数据。ORACLE、MSSQL(Microsoft SQL Server)、MYSQL是三大主流数据库系统,它们各自提供了不同的方式来实现递归查询。 首先...

    mysql 树形结构查询

    在 MySQL 中,树形结构查询可以使用递归存储过程来实现。递归存储过程是一种特殊的存储过程,可以递归调用自身,以实现树形结构的查询。递归存储过程可以根据需要设置递归深度,以控制查询的深度。 在上面的例子中...

    Oracle递归树形结构查询功能

    在Oracle中,树形结构查询的基本语法如下: ```sql SELECT [LEVEL], * FROM table_name START WITH 条件1 CONNECT BY PRIOR 条件2 WHERE 条件3 ORDER BY 排序字段 ``` - `LEVEL`:这是一个伪列,用于表示树的层级...

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

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

    jpa单表递归树形结构实现

    在本示例中,我们将探讨如何使用Spring JPA来实现单表递归树形结构。 首先,我们需要理解递归树形结构。在数据库中,树形结构通常通过自关联来表示,即一个表的某个字段引用该表自身,形成一个层级关系。对于单表...

    MySQL递归查询

    MySQL 递归查询是指在 MySQL 中实现类似 Oracle Hierarchical Queries 的功能,用于查询树形结构中的所有子节点。由于 MySQL 目前还没有内置的递归查询功能,因此需要使用其他方法来实现。 第一种方法:使用函数来...

    MySQL多种递归查询方法.docx

    ### MySQL多种递归查询方法详解 #### 一、Oracle中的递归查询方法 在Oracle数据库中,递归查询可以通过`...通过这些知识点的学习,不仅可以更好地理解递归查询的实现方法,还能掌握MySQL中用于字符串处理的强大工具。

    两种mysql递归tree查询效率-mysql递归tree

    2. **利用变量和循环**:这种方法通过在SQL查询中使用变量和循环结构来实现递归查询,适用于层级结构较为复杂的场景。 ##### 方法一:使用自连接和递归联合 自连接和递归联合是一种常见的递归查询方式,其核心思想...

    MySQL实现递归查询的三种方式.rar

    在数据库管理中,递归查询是一种处理层次结构数据的有效方法,尤其在关系型数据库如MySQL中,递归查询可以帮助我们解决树形结构或有层级关系的数据检索问题。本资料主要探讨了MySQL中实现递归查询的三种常见方法:自...

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

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

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

    在`Oracle中的树状查询(递归查询) - 鱼与飞鸟 - CSDNBlog.htm`这篇博客中,作者通过具体的实例详细讲解了如何在权限查询中使用递归查询,包括如何建立树形结构,以及如何避免无限递归等问题。 8. **补充资源** - ...

    MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)

    递归查询是指在一个查询中调用自身的查询,以便实现某些复杂的查询逻辑。在MyBatis中,我们可以使用递归查询来实现 N级联动效果。 两种实现方式 在本文中,我们将介绍两种实现 N级联动效果的方式:使用递归函数和...

    mysql 递归查询 树型结构 代码逻辑

    下面我们将通过具体的例子来深入探讨如何使用MySQL进行递归查询,并结合Java代码实现树形结构的构建。 #### 数据表设计 根据题目中的描述,我们可以看到一个简化的数据表结构如下: - **Id**:记录的唯一标识。 -...

    Mysql树形递归查询的实现方法

    在MySQL中实现树形递归查询,由于MySQL本身并不直接支持类似于Oracle的`START WITH ... CONNECT BY`语法,因此需要采用其他策略。通常,我们可以利用自定义函数或递归查询的方式来处理树形结构数据。以下将详细介绍...

    oracle-递归查询地区名称

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

    mybatis递归查询菜单树

    递归查询是在数据库中查找具有层级关系的数据时的一种常见方法,通过反复调用自身来遍历整个树结构。 递归查询在构建菜单树时尤其有用,因为菜单通常有层级关系,如父菜单包含子菜单,子菜单可能还有孙子菜单等。在...

    用递归实现C#树形结构

    本篇将详细探讨如何使用递归方法来实现C#中的树形结构。 首先,理解树形结构的基本概念至关重要。在计算机科学中,树是由节点(也称为顶点)和边组成的非线性数据结构。每个节点可以有零个或多个子节点,而顶部的...

    mysql递归查询.doc

    MySQL 递归查询是指在 MySQL 数据库中使用递归函数来实现树形结构数据的查询,例如部门表中某个部门的所有下属部分或者某个部分的所有上级部门。 在 MySQL 中实现递归查询需要使用自定义函数(Stored Function),...

Global site tag (gtag.js) - Google Analytics