递归查询-mysql-oracle

本文介绍了如何在MySQL和Oracle数据库中使用递归查询来从父级查询子级记录。对于MySQL, 通过创建和调用自定义函数实现递归查询;而在Oracle中,则采用START WITH和CONNECT BY语法。两种方法都提供了示例代码帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本文介绍递归为通过父级查询子级

一、递归查询-mysql

1.创建函数

-- 删除函数
drop function if exists getLoopDepartId;
-- 创建函数
-- DELIMITER 
create function getLoopDepartId(rootId varchar(20)) 
returns varchar (1000)
BEGIN 
    DECLARE pTemp VARCHAR(1000);            
    DECLARE cTemp VARCHAR(1000);      -- 节点ID(临时变量)

    SET pTemp = '$';  
    SET cTemp =cast(rootId as CHAR);  -- 把rootId强制转换为字符。

    WHILE cTemp is not null DO  
       SET pTemp = concat(pTemp,',',cTemp);  -- 把所有节点连接成字符串。
       SELECT group_concat(departId) INTO cTemp FROM depart   
       WHERE FIND_IN_SET(parentId,cTemp)>0;
    END WHILE;  
    RETURN pTemp;  
END 
-- DELIMITER 

2.调用函数

-- mysql递归查询
SELECT
   departId
FROM 
    depart T,
    (SELECT @DATAS := getLoopDepartId (1)) x 
WHERE find_in_set (departId, @DATAS);
-- 实际应用通常套一层
select * from depart a
	where a.departId in (
		SELECT
			 departId
		FROM 
				depart T,
				(SELECT @DATAS := getLoopDepartId (1)) x 
		WHERE find_in_set (departId, @DATAS)
	)

3.查询结果示例

在这里插入图片描述

二、递归查询-Oracle

1.Oracle较简单语句如下

select * from depart a where a.departId in (
	select b.departId from depart b
	start with b.departId = '1'
	connect by prior b.departId = b.parentId
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值