数据库递归

CREATE function [dbo].[GetChildAccount](@ID varchar(10))   
returns @t table(ID varchar(10),ParentID varchar(10),Level int)   
as  
begin  
    declare @i int  
    set @i = 1   
    insert into @t select @ID,@ID,0 --当前级,本级,如果不要的话可以注释掉或再加个参数来选择操作   
    insert into @t select AccountID,ParentID,@i from Account where ParentID = @ID   
  
     while @@rowcount<>0   
    begin  
        set @i = @i + 1   
        insert into @t   
        select  
             a.AccountID,a.ParentID,@i   
        from  
             Account a,@t b   
        where  
             a.ParentID=b.ID and b.Level = @i-1   
    end  
    return  
end  

 

------------------------------------------------------------------------------------------------

表机构如下:

SELECT [AccountID] ,[Name] ,[ParentID] ,[Type] FROM [Attractions].[dbo].[Account]

 

查询结果如下:

 

使用函数查询:

SELECT [AccountID] ,[Name] ,[ParentID] ,[Type] FROM [Attractions].[dbo].[Account]
where [AccountID]  in (Select ID from dbo.GetChildAccount(2))

查询结果如下:

### Oracle 数据库递归查询的实现方法 在 Oracle 数据库中,递归查询通常通过 `CONNECT BY` 子句或者更现代的方式——使用带有递归功能的 `WITH` 子句(即 Common Table Expressions, CTEs)来实现。以下是两种主要的方法及其示例。 #### 方法一:使用 CONNECT BY 实现递归查询 Oracle 提供了强大的层次查询能力,其中 `START WITH` 和 `CONNECT BY` 是核心组件。这种方法适用于树形结构数据的遍历,比如组织架构、文件目录等场景。 假设有一个表示员工关系的表 `EMPLOYEE`,其字段如下: - `ID`: 员工唯一标识符 - `NAME`: 员工姓名 - `MANAGER_ID`: 上级领导的 ID (NULL 表示无上级) ##### 查询所有下属员工的 SQL 示例 ```sql SELECT LEVEL, NAME, ID, MANAGER_ID FROM EMPLOYEE START WITH MANAGER_ID IS NULL -- 从根节点开始 CONNECT BY PRIOR ID = MANAGER_ID; -- 定义父节点与子节点的关系 ``` 此查询会返回整个树状结构的数据,并按照层级顺序排列[^2]。 --- #### 方法二:使用 WITH RECURSIVE 实现递归查询 虽然传统上 Oracle 更倾向于使用 `CONNECT BY` 来处理递归问题,但从版本 11g 开始,Oracle 支持基于 ANSI 标准的递归 CTE 功能。这种方式更加灵活且易于理解。 ##### 同样以上述 `EMPLOYEE` 表为例: ###### 查询某个特定员工的所有直属和间接下属 ```sql WITH RECURSIVE EmployeeHierarchy AS ( SELECT ID, NAME, MANAGER_ID, 0 AS Level FROM EMPLOYEE WHERE ID = :EmployeeId -- 替换为具体目标员工的 ID UNION ALL SELECT e.ID, e.NAME, e.MANAGER_ID, eh.Level + 1 FROM EMPLOYEE e INNER JOIN EmployeeHierarchy eh ON e.MANAGER_ID = eh.ID ) SELECT * FROM EmployeeHierarchy; ``` 在此例子中,我们首先选取初始记录作为种子集合 (`WHERE ID = :EmployeeId`),接着不断扩展该集合直到无法找到更多匹配项为止。最终结果包含了指定员工的所有后代成员以及它们各自的级别信息[^3]。 需要注意的是,在实际应用过程中可能还需要考虑性能优化等问题,例如设置合适的索引来加速访问路径上的列。 --- ### 总结 对于简单的树型结构操作而言,利用传统的 `CONNECT BY` 可能更为简洁高效;而对于复杂逻辑则推荐采用标准化形式的递归 CTE 方案以便于维护阅读。两者各有优劣需视具体情况而定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值