`
- 浏览:
7943 次
- 性别:
- 来自:
北京
-
mysql数据库实现类似oracle connect by prior的查询
--注下面的语句用到了表DROP TABLE IF EXISTS `a_sys_org`;CREATE TABLE `a_sys_org` ( `org_id` varchar(32) NOT NULL COMMENT '机构号', `org_name` varchar(256) NOT NULL COMMENT '机构名称', `parent_org_id` varchar(32) NOT NULL COMMENT '父机构号', PRIMARY KEY (`org_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统机构表';-- 方法1,函数实现-- 注意 SELECT getChildOrg('00010');-- 最大支持字符串连接102400DROP FUNCTION IF EXISTS getChildidList;CREATE FUNCTION getChildidList(rootId VARCHAR(32))RETURNS textBEGINDECLARE sTemp text;DECLARE sTempChd text;SET@@group_concat_max_len = 102400;SET sTemp = '$';SET sTempChd = rootId;WHILE sTempChd IS NOT NULL DOSET sTemp = concat(sTemp, ',', sTempChd);SELECTgroup_concat(org_id) INTO sTempChdFROMa_sys_orgWHEREFIND_IN_SET(parent_org_id, sTempChd) > 0;END WHILE;SET@@group_concat_max_len = 1024;RETURN SUBSTRING(sTemp,3);END-- 方法2,存储过程+中间表-- 存储过程实现mysql递归查询,类似oracle start with connect by prior-- 注意 call getChildOrg('00010');-- 递归有深度限制,最大是255层DROP PROCEDURE IF EXISTS getChildOrg;CREATE PROCEDURE getChildOrg (IN rootid VARCHAR(32))BEGINDECLARE _level_var INT;DROP TABLE IF EXISTS temp_child_list;CREATE TABLE temp_child_list (_id VARCHAR(32),_level INT);SET _level_var = 0; INSERT INTO temp_child_list (_id, _level) VALUE(rootid,_level_var);SET _level_var = _level_var + 1;INSERT INTO temp_child_list (_id, _level)SELECTorg_id,_level_varFROMa_sys_orgWHEREparent_org_id = rootid;WHILE ROW_COUNT() > 0DOSET _level_var = _level_var + 1;INSERT INTO temp_child_list SELECTa.org_id,_level_varFROMa_sys_org a,temp_child_list bWHEREa.parent_org_id = b._idAND b._level = _level_var - 1;END WHILE; SELECT _id FROM temp_child_list ORDER BY _level; DROP TABLE IF EXISTS temp_child_list;END;-- 方法3,存储过程+临时表-- 存储过程实现mysql递归查询,类似oracle start with connect by prior-- 注意 call getChildOrg('00010');-- 递归有深度限制,最大是255层-- 此存储过程利用了临时表DROP PROCEDURE IF EXISTS showChildList;CREATE PROCEDURE showChildList (IN rootId VARCHAR(32))BEGIN SET@@max_sp_recursion_depth=99;DROP TEMPORARY TABLE IF EXISTS temp_child_list;CREATE TEMPORARY TABLE temp_child_list ( sno INT PRIMARY KEY auto_increment, _id VARCHAR (32), _depth INT );-- 插入当前节点INSERT INTO temp_child_list (_id, _depth) VALUES (rootId ,- 1);-- 插入子节点CALL createChildList (rootId, 0);SELECT o.org_id FROM temp_child_list t, a_sys_org o WHERE t._id = o.org_id ORDER BY t.sno;END;DROP PROCEDURE IF EXISTS createChildList;CREATE PROCEDURE createChildList ( IN rootId VARCHAR (32), IN depth_var INT )BEGINDECLARE done INT DEFAULT 0;DECLARE b VARCHAR (32);DECLARE cur1 CURSOR FOR SELECT org_id FROM a_sys_org WHERE parent_org_id = rootId;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;INSERT INTO temp_child_list (_id, _depth) SELECT org_id, depth_var FROM a_sys_org WHERE parent_org_id = rootId;OPEN cur1;FETCH cur1 INTO b;WHILE done = 0 DO CALL createChildList (b, depth_var + 1);FETCH cur1 INTO b;END WHILE;CLOSE cur1;END;
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
### Oracle Start With.Connect By Prior 子句实现递归查询 #### 概述 在Oracle数据库中,`Start With.Connect By Prior`子句是执行递归查询的一种强大工具,主要用于处理层次结构数据。这类数据通常存在于组织...
ORACLE 查询树型关系(connect_by_prior_start_with) Oracle 查询树型关系是指使用 START WITH 和 CONNECT BY 子句来实现 SQL 的层次查询。从 Oracle 9i 开始,可以通过 SYS_CONNECT_BY_PATH 函数实现将父节点到...
在Oracle数据库中,递归查询可以通过`START WITH CONNECT BY PRIOR`语句实现。此语句允许用户按照树状结构来检索数据。 ##### 1. `START WITH CONNECT BY PRIOR`用法详解 **基本语法**: ```sql SELECT * FROM ...
connect by递归查询基本语法是: select 1 from 表格 start with … connect by prior id = pId start with:表示以什么为根节点,不加限制可以写1=1,要以id为123的节点为根节点,就写为start with id =123 ...
这些技术通常提供API接口,将数据库查询结果转化为JSON格式,供前端渲染。 总的来说,递归查询菜单树是数据库操作的一个常见应用场景,它涉及到数据库设计、SQL查询技巧以及前后端的数据交换。理解并掌握这些知识点...
ORACLE、MSSQL(Microsoft SQL Server)、MYSQL是三大主流数据库系统,它们各自提供了不同的方式来实现递归查询。 首先,我们来看ORACLE数据库中的递归查询。ORACLE通过CONNECT BY子句来实现递归查询。CONNECT BY...
CONNECT BY PRIOR`子句直接支持递归查询,而SQL Server 2005及以上版本则利用公共表表达式(CTE)的递归调用来实现。POSTgreSQL同样支持CTE子查询进行递归。这些数据库允许在SQL语句中直接对子查询进行递归调用,...
本文将深入探讨如何通过递归查询来解决这类问题,并着重讲解使用`WITH`语句来实现递归查询的方法,适用于多种数据库系统,如MySQL、PostgreSQL、SQL Server等。 一、理解递归查询 递归查询是一种在数据库中遍历层级...
本文将详细介绍Oracle、MySQL以及SQL Server这三种常用数据库管理系统中的分页查询实现方法。 #### 一、Oracle 分页查询 在Oracle中实现分页查询主要依靠`ROWNUM`伪列,这是一种非常简单但功能强大的机制。下面将...
在Oracle数据库中,WM_CONCAT是一个非常实用的聚合函数,用于将一组字符串连接成一个单一的字符串,类似于SQL Server中的STRING_AGG或MySQL中的GROUP_CONCAT。然而,Oracle官方并没有提供这个函数,它是一个第三方...
在Oracle中,递归查询主要通过`START WITH`和`CONNECT BY PRIOR`子句实现。 ### 二、递归查询的基本语法 递归查询的基本语法如下: ```sql SELECT column_name(s) FROM table_name START WITH condition CONNECT ...
CONNECT BY`的递归查询语法,我们需要采取其他策略来实现类似的功能。 在Oracle中,`START WITH`指定查询的起始点,而`CONNECT BY`则用于定义层次结构,`PRIOR`关键字用来链接当前行与它的父行。例如,如果有一个`...
Oracle的语法与MySQL类似,但在处理层级数据时,可能需要利用Hierarchical Query(层级查询)功能。例如,使用CONNECT BY子句来查询层级关系: ```sql SELECT level, sys_connect_by_path(name, '/') AS 路径 FROM ...
在进行树形查询时,我们通常会用到递归SQL查询或者利用数据库提供的特定功能,如Oracle的CONNECT BY,MySQL的WITH RECURSIVE,或者SQL Server的Hierarchical Queries。这些语法允许我们构建一个层次结构,从根节点...
SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。 SQL语言主要包含5个部分 数据定义...
通过TFDConnection、TFDQuery、TFDTable等组件,可以实现数据库的连接、查询和数据操作。使用FireDAC的优点在于其强大的数据类型转换能力,跨平台特性,以及对异步操作的支持。 3. 数据库连接字符串:无论是使用ADO...
`Connect By Prior`是Oracle数据库中的一个特殊查询语句,用于检索具有层次结构的数据。它允许你定义节点之间的父/子关系,并按层次顺序检索结果。例如: ```sql SELECT * FROM TBL_TEST START WITH id = 10 ...
CONNECT BY是Oracle数据库中特有的语法,用于创建层次结构查询。它可以基于表中的父子关系来生成树状结构的数据。例如: ```sql SELECT LEVEL, empno, ename FROM emp START WITH mgr IS NULL CONNECT BY PRIOR ...