暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle和MySQL递归查询本下级

TNodes 2021-07-19
885

Oracle 操作(select…start with…connect by…prior)

结构表如下

create table regions(

    region_id number(8) primary key,

    p_region_id number(10),

    region_path varchar2(255),

    region_grade number(8),

    local_name varchar2(100),

    zipcode varchar2(20),

    cod varchar2(4)

);

查找一个节点下面的所有节点,其中region_id是传入的参数

SELECT * FROM regions START WITH region_id = 1 connect BY prior region_id = p_region_id;

查询结果如下

MySQL 操作

创建表

DROP TABLE IF EXISTS `es_regions`;

CREATE TABLE `regions` (

  `region_id` int(10) NOT NULL AUTO_INCREMENT,

  `p_region_id` int(10) DEFAULT NULL,

  `region_path` varchar(255) DEFAULT NULL,

  `region_grade` int(8) DEFAULT NULL,

  `local_name` varchar(100) NOT NULL,

  `zipcode` varchar(20) DEFAULT NULL,

  `cod` varchar(4) DEFAULT NULL,

  PRIMARY KEY (`region_id`)

) ENGINE=InnoDB AUTO_INCREMENT=489 DEFAULT CHARSET=utf8;

利用find_in_set()函数和group_concat()函数实现递归查询:

DROP FUNCTION IF EXISTS querychild;


SET GLOBAL log_bin_trust_function_creators = 1;

DELIMITER $$

CREATE FUNCTION querychild(param INT)

RETURNS VARCHAR(4000)

BEGIN

DECLARE temp VARCHAR(4000);

DECLARE sname VARCHAR(4000);


SET temp = '$';

SET sname = CAST(param AS CHAR);

WHILE sname IS NOT NULL DO

SET temp = CONCAT(temp,',',sname);

SELECT GROUP_CONCAT(region_id) INTO sname FROM regions WHERE FIND_IN_SET(p_region_id,sname)>0;

END WHILE;

RETURN temp;

END $$

调用方式

SELECT * FROM regions WHERE FIND_IN_SET(region_id, querychild(1));

查询结果如下:


文章转载自TNodes,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论