问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

sql语句实现递归查询所有节点,mysql和oracle都能用的

发布网友 发布时间:2022-04-21 18:21

我来回答

2个回答

懂视网 时间:2022-04-07 19:08

更多相关免费学习推荐:mysql教程(视频)

mysql查询子节点的方法:

创建menu表:

CREATE TABLE `menu` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单id',
 `parent_id` int(11) DEFAULT NULL COMMENT '父节点id',
 `menu_name` varchar(128) DEFAULT NULL COMMENT '菜单名称',
 `menu_url` varchar(128) DEFAULT '' COMMENT '菜单路径',
 `status` tinyint(3) DEFAULT '1' COMMENT '菜单状态 1-有效;0-无效',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12212 DEFAULT CHARSET=utf8;

插入数据:

INSERT INTO `menu` VALUES ('0', null, '菜单0', ' ', '1');
INSERT INTO `menu` VALUES ('1', '0', '菜单1', '', '1');
INSERT INTO `menu` VALUES ('11', '1', '菜单11', '', '1');
INSERT INTO `menu` VALUES ('12', '1', '菜单12', '', '1');
INSERT INTO `menu` VALUES ('13', '1', '菜单13', '', '1');
INSERT INTO `menu` VALUES ('111', '11', '菜单111', '', '1');
INSERT INTO `menu` VALUES ('121', '12', '菜单121', '', '1');
INSERT INTO `menu` VALUES ('122', '12', '菜单122', '', '1');
INSERT INTO `menu` VALUES ('1221', '122', '菜单1221', '', '1');
INSERT INTO `menu` VALUES ('1222', '122', '菜单1222', '', '1');
INSERT INTO `menu` VALUES ('12211', '1222', '菜单12211', '', '1');

得到的目录结构如下图所示:

aae031375fbee34836f6089e2449b4e.png

查询

先贴出sql语句:

select id from (
  select t1.id,
  if(find_in_set(parent_id, @pids) > 0, @pids := concat(@pids, ',', id), 0) as ischild
  from (
   select id,parent_id from re_menu t where t.status = 1 order by parent_id, id
   ) t1,
   (select @pids := 要查询的菜单节点 id) t2
  ) t3 where ischild != 0

比如,要查询菜单节点12的所有子节点,则查处的结果为:

0a844d9742cdf679220d22a5a1bdad4.png

热心网友 时间:2022-04-07 16:16

首先说一下Oracle的递归查询,相信大部分人都知道很简单。无非start with connect by 函数。下面是从pId向子节点递归查询的例子,unId是数据库表中的主键。

如果是从子节点递归到父节点查询,就把start with 换成unid,prior左右对换

下面再讲MySql 的递归查询方式。MySql没有Oracle的强大功能,虽然都是同一个公司的产品。所以只能靠自己写。有很多方法,用sql去循环查询,或者写存储过程,我这里只提供一种。就是新建一个function函数。

表结构不说了,无非就是 Id ,pId,其他列。下面是创建一个递归查询子节点的函数

DROP FUNCTION IF EXISTS queryChildrenPowerInfo;

CREATE FUNCTION `queryChildrenPowerInfo` (powerId VARCHAR(2000))

RETURNS VARCHAR(2000)

BEGIN

DECLARE sTemp VARCHAR(2000);

DECLARE sTempChd VARCHAR(2000);

SET sTemp = '$';

SET sTempChd = cast(powerId as CHAR);

WHILE sTempChd is not NULL DO

SET sTemp = CONCAT(sTemp, ',', sTempChd);

SELECT group_concat(id) INTO sTempChd FROM t_discretionary_power where FIND_IN_SET(pId,sTempChd)>0;

END WHILE;

return sTemp;

END

调用的时候:select  queryChildrenPowerInfo("fa2528924c7e9168014c9bedfe04039c"); 该语句会返回Id和父Id等于传入参数powerId的一个字符串,中间有逗号隔开如图

下面这句代码的意思是,查询出 t_discretionary_power  表中,t.id 等于上面查询出的结果集的数据。FIND_IN_SET(A,B)是MYSQL的函数。意思是查找在B集合中有A的数据。相当于In

select t.* from t_discretionary_power  t where FIND_IN_SET(t.id,queryChildrenPowerInfo('fa2528924c7e9168014c9bedfe04039c'))

sql语句实现递归查询所有节点,mysql和oracle都能用的

首先说一下Oracle的递归查询,相信大部分人都知道很简单。无非start with connect by 函数。下面是从pId向子节点递归查询的例子,unId是数据库表中的主键。如果是从子节点递归到父节点查询,就把start with 换成unid,prior左右对换 下面再讲MySql 的递归查询方式。MySql没有Oracle的强大功能,虽然都是同...

如何使用MySQL递归的查询层级数据?

利用MySQL递归调用函数,能直接在SQL语句中调用,实现树状数据的遍历。验证方法如下:执行查询后,获取到的结果如下图所示。

MySQL中的上下级关系查询mysql上级找下级

1. 使用递归查询 递归查询是一种基于循环查询的方法,可以解决具有层级结构的数据查询。在MySQL中,可以使用WITH RECURSIVE语句来实现递归查询。例如,假设我们有一个表格叫做category,具有ID和parent_ID两个字段,用于表示每个分类的层级结构。我们可以使用以下代码来查询所有子分类:WITH RECURSIVE subcategories...

MySQL递归查询上下级菜单

关键点在于使用了`GROUP_CONCAT()`函数,它在分组查询中将同一分组内的值连接起来,返回一个字符串结果。例如,在`user`用户表中,查询名字相同的用户最小年龄的SQL语句如下,执行结果展示如下。若要查询所有名字相同的人的所有年龄,使用`GROUP_CONCAT()`函数可以实现,如下所示,执行结果为:通过`GROUP...

MySQL实现上下级递归的方法及其应用mysql上下级递归

一、基于递归查询实现上下级关系 在MySQL中,使用递归查询的方法就是通过with recursive关键字实现。with recursive用于指示一个递归的结果集,并且配合select、union等关键字组成查询语句。下面是一个示例:–假设有一个dept表,其中包含部门编号(dept_id)和上级部门编号(parent_id)字段 with ...

MySQL无法实现递归操作mysql不支持递归

1. 递归查询语句中的NULL值处理和数据类型转换的支持;2. 递归查询语句中的尾递归优化。这两个组件都是实现递归操作的核心部分。在MySQL中,尝试使用递归查询语句时,会产生“ERROR 1953 (HY000): Recursive limit 256 (as set by the max_sp_recursion_depth variable) was exceeded”,这是因为MySQL...

MySQL数据库环境中的上下级递归操作详解mysql上下级递归

1. 使用连接(JOIN)操作 连接操作是一种常见的递归操作方法。它可以将多个表连接起来,从而实现递归查询。假设我们有一个员工表,其中每个员工都有一个上级领导,根据这个关系,我们可以使用连接操作来查询某个员工的所有下属。我们需要在员工表中添加一个上级领导的字段。ALTER TABLE `employee` ADD ...

选读SQL经典实例笔记14_层次查询

3. 展现祖孙关系则需要递归查询,如SQL Server的WITH递归查询,或Oracle的SYS_CONNECT_BY_PATH函数。sql3.4.1...sql3.5.1.1 4. 创建层次视图是将这些关系结构化,便于查询。比如,MySQL和Oracle的CREATE VIEW语句:sql4.1.1...sql4.5.1.1 5. 想要找出特定父节点的所有子节点,可以使用自...

mysql 怎么实现sql的with递归

概念说不一定理解,给你一个例子你自己参悟。 SELECT TEACHER FROM C AS X WHERE UNIQUE(SELECT TEACHER FROM C AS Y WHERE Y.TEACHER=X.TEACHER);

oracle ,mysql 和sqlserver的主要区别有哪些?

但是sqlserver需要收费,mysql不用。三、如果按功能上来说,oracle最为强大,oracle支持递归查询,二后两者不支持;四、三个数据库中,只有sqlserver有完整的图形化操作界面,而oracle与mysql都要借助于其他的第三方数据库图形操作界面,比如oracle用的大多都是plsql。

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
广州小孩子玩具批发市场详细地址 人和空巷假日别墅酒店到地铁站怎么走? 求驱魔双修偏力加点,所有技能我都想要,但不知道SP够不够 如何判断烟机功率 广州空港假日别墅酒店离机场有多远? 阿拉伯帝国(关于阿拉伯帝国的基本详情介绍) “孟春朔日雷声发”的出处是哪里 “行人自厌冲泥苦”的出处是哪里 “伤俗兮泥浊”的出处是哪里 商场积分透支×无感停车到底有多高级和智能 数据库中nextval是什么意思 MySQL的存储过程当中,有没有类似于Oracle的表类型 想问下买OPPO Find X3还是买小米K40好? oracle数据库和mysql数据库的区别 ORACLE分析函数能在MYSQL里实现吗? 用MYSQL的存储过程 mysql中now()函数在oracle中怎么用 有没有oracle函数与mysql函数转化的工具 mysql里有没有类似oracle里的ADD_MONTHS函数,自能... 华为oppo手机哪个系列的手机,推荐一些好用性价比高? mysql nextval函数在别的库怎么取 请教一下mysql下有没有类似oracle的函数max over p... OPPOfindx3和华为mate40买那个? mysql 函数中与Oracle中ltrim函数功能相同的函数是... mysql中有和Oracle中的nvl2(expr1,expr2,expr3)效... 如何制作好吃家蛋挞液 mysql 有没有类似 oracle lag函数 OPPO Find X3值得入手吗? 怎么弄蛋挞液 MySQL实现类似Oracle序列的方案 怎样做蛋挞液简单? mysql 与oracle中的存储过程及函数有什么区别,尽... mysql和oracle的不同的方法 oracle 函数里有像mysql数据库中的SUBSTRING_INDEX... 12306待兑现显示候补人数较少是多少? 开一个奶茶店有什么风险吗,投资大概需要多少 开奶茶店有什么风险,如何分析评估 火车票候补最多能补多少人 我不想在家带娃了,打算自己做餐饮创业,加盟嗨茶... 开奶茶店的机会与威胁 火车票候补有什么规律吗? 12306候补人数较少大概有多少人 加盟与创业风险识别依据和方法是什么? 12306可以候补几个订单 重力势能的正负含义? 怎么看重力势能的正负??可以举个例子吗??(好... 为什么重力势能有正负,弹性势能只有正值,而引力... 重力势能为负,是不是方向是与正方向相反,在0以下... 怎么看重力势能的正负??可以举个 例子吗??(好... 比较重力势能大小时要带正负号么? 重力势能正负号区别和几时取正几时取负
  • 焦点

最新推荐

猜你喜欢

热门推荐