`

使用MYSQL实现Oracle的Start with...Connect By递归树查询

 
阅读更多

创建表nodelist:

 

  1. CREATE TABLE nodelist(  
  2.  id INT PRIMARY KEY,            -- 本节点ID。  
  3.  nodename VARCHAR(20),          -- 节点名称,为方便辨别而已。  
  4.  pid INT                        -- 父节点。  
  5. ); 

 

插入表测试数据:

 

 

  1. Insert INTO nodelist VALUES(1,'A',null);  -- 父节点为,即根节点。
  2. Insert INTO nodelist VALUES(2,'B',1);  
  3. Insert INTO nodelist VALUES(3,'C',1);  
  4. Insert INTO nodelist VALUES(4,'D',2);  
  5. Insert INTO nodelist VALUES(5,'E',3);  
  6. Insert INTO nodelist VALUES(6,'F',3);  
  7. Insert INTO nodelist VALUES(7,'G',5);  
  8. Insert INTO nodelist VALUES(8,'H',7);  
  9. Insert INTO nodelist VALUES(9,'I',8);  
  10. Insert INTO nodelist VALUES(10,'J',8);  

 

创建函数getChildList(): 

 

  1. CREATE FUNCTION `getChildList`(rootId INT) -- rootId为你要查询的节点。
  2.      RETURNS VARCHAR(1000)  
  3.      BEGIN 
  4.        DECLARE pTemp VARCHAR(1000);  
  5.        DECLARE cTemp VARCHAR(1000);  -- 两个临时变量
  6.       
  7.        SET pTemp = '$';  
  8.        SET cTemp =cast(rootId as CHAR);  -- 把rootId强制转换为字符。
  9.       
  10.        WHILE cTemp is not null DO  
  11.          SET pTemp = concat(pTemp,',',cTemp);  -- 把所有节点连接成字符串。
  12.          SELECT group_concat(id) INTO cTemp FROM nodelist   
  13.          WHERE FIND_IN_SET(pid,cTemp)>0;
  14. -- FIND_IN_SET(str,strlist)的方法网上大把不解释。
  15.        END WHILE;  
  16.        RETURN pTemp;  
  17.      END 

 

执行方法getChildList(1):

 

  1. SELECT getChildList(1);  

运行结果如下图:

 

 

查询节点为“3”下的所有节点:

 

 

  1. SELECT * FROM nodelist WHERE FIND_IN_SET(id, getChildList(3)); 

 

 

运行结果如下图:

 

来源 : http://51wifygoo1go.blog.51cto.com/6455479/1122729

 

 

 

  • 大小: 3.4 KB
  • 大小: 4.1 KB
分享到:
评论

相关推荐

    Oracle start with.connect by prior子句实现递归查询

    ### Oracle Start With.Connect By Prior 子句实现递归查询 #### 概述 在Oracle数据库中,`Start With.Connect By Prior`子句是执行递归查询的一种强大工具,主要用于处理层次结构数据。这类数据通常存在于组织...

    MySQL多种递归查询方法.docx

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

    ORACLE查询树型关系(connect_by_prior_start_with)

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

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

    CONNECT BY子句通常配合START WITH子句使用,其中START WITH指定了递归的起点,而CONNECT BY用于定义父子关系。CONNECT BY子句中的PRIOR关键字用于表示层级之间的连接,它指向前一个步骤得到的列值。例如,如果当前...

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

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

    Oracle递归查询start with connect by prior的用法

    connect by递归查询基本语法是: select 1 from 表格 start with … connect by prior id = pId start with:表示以什么为根节点,不加限制可以写1=1,要以id为123的节点为根节点,就写为start with id =123 ...

    数据库设计之递归树查询

    本文将深入探讨如何通过递归查询来解决这类问题,并着重讲解使用`WITH`语句来实现递归查询的方法,适用于多种数据库系统,如MySQL、PostgreSQL、SQL Server等。 一、理解递归查询 递归查询是一种在数据库中遍历层级...

    一种MySQL数据库SQL递归查询的研究与实现.pdf

    CONNECT BY PRIOR`子句直接支持递归查询,而SQL Server 2005及以上版本则利用公共表表达式(CTE)的递归调用来实现。POSTgreSQL同样支持CTE子查询进行递归。这些数据库允许在SQL语句中直接对子查询进行递归调用,...

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

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

    Mysql+Oracle函数文档

    5. **连接函数**:如 `CONNECT_BY_ROOT()`, `START WITH ... CONNECT BY`,用于构建复杂的层次查询。 除了这些基础函数,MySQL 和 Oracle 还支持大量的高级特性,例如窗口函数、递归查询、正则表达式等。在实际应用...

    SQL语句 递归

    在Oracle中,递归查询主要通过`START WITH`和`CONNECT BY PRIOR`子句实现。 ### 二、递归查询的基本语法 递归查询的基本语法如下: ```sql SELECT column_name(s) FROM table_name START WITH condition CONNECT ...

    dbmove_sql语句转化.zip_MYSQL_dbmove_oracle

    Oracle的CONNECT BY用于构建层次查询,而在MySQL中可能需要递归的用户定义变量或JOIN操作。子查询在两个系统中语法也略有不同。 7. **事务控制**: Oracle和MySQL都支持事务,但语法上有一些差异。如Oracle使用...

    树形查询带记录数量

    在进行树形查询时,我们通常会用到递归SQL查询或者利用数据库提供的特定功能,如Oracle的CONNECT BY,MySQL的WITH RECURSIVE,或者SQL Server的Hierarchical Queries。这些语法允许我们构建一个层次结构,从根节点...

    mysql生成省市县行政区划SQL语句

    例如,使用CONNECT BY子句来查询层级关系: ```sql SELECT level, sys_connect_by_path(name, '/') AS 路径 FROM 行政区划 START WITH name = '中国' CONNECT BY PRIOR id = parent_id; ``` 这个查询会返回从'中国...

    (3.0版本)自己写的struts2+hibernate+spring实例

    mysql和sqlserver不知道有没有start with这个sql. jar包:项目中除了使用了struts2,hibernate3.0和spring1.8以外(用spring2.0的包也可以.不能低于1.8的包.)还是用了junit,ajax,第三方的table组件.等等.所以需要下载...

    tree(数据库动态生成)

    可能需要用到递归查询或者利用层次查询(如MySQL的`WITH RECURSIVE`,Oracle的`START WITH...CONNECT BY`)来遍历所有层级。 3. **前端展示**:在JavaScript中,你可以使用Ajax技术异步地从服务器获取这些数据,...

    总结问题集合

    `Connect By Prior`是Oracle数据库中的一个特殊查询语句,用于检索具有层次结构的数据。它允许你定义节点之间的父/子关系,并按层次顺序检索结果。例如: ```sql SELECT * FROM TBL_TEST START WITH id = 10 ...

Global site tag (gtag.js) - Google Analytics