[转]树结构表递归查询在ORACLE和MSSQL中的实现方法
树结构表:记录树形数据的二维数据表,包含"本节点ID”和"父节点ID"
经常需要进行递归查询某个节点下的所有节点数据
以下是分别在ORACLE和MSSQL中的实现
如本例子中涉及的表
TB_SM_ORGAN(
ORG_ID int,
ORG_CODE varchar(20),
ORG_NAME varchar(40),
IS_INITDATA char(1),
ORG_PARENTID int,
ORG_TYPEID varchar(6),
ORG_AGENTID int,
ORG_STATUS char(3),
ORG_DESC varchar(200))
【ORACLE】
直接支持,使用SELECT * WHERE ..... START WITH ..... CONNECT BY 本节点ID=父节点ID
例如:
SELECT * FROM TB_SM_ORGAN where Org_Status = 'S0A' START WITH ORG_ID= @OrgId CONNECT BY PRIOR ORG_ID = ORG_PARENTID order by ORG_CODE
【MSSQL】
没有增强型SQL实现,需要使用临时表和循环多次查询的方式实现
create function GetOrganSubTreeByOrganID (@id int)
returns @t table(
ORG_ID int,
ORG_CODE varchar(20),
ORG_NAME varchar(40),
IS_INITDATA char(1),
ORG_PARENTID int,
ORG_TYPEID varchar(6),
ORG_AGENTID int,
ORG_STATUS char(3),
ORG_DESC varchar(200))
as
begin
insert @t select * from TB_SM_ORGAN where org_id = @id
while @@rowcount > 0
insert @t select a.* from TB_SM_ORGAN as a inner join @t as b
on a.org_parentid = b.org_id and a.org_id not in(select org_id from @t)
return
end
使用方法
经常需要进行递归查询某个节点下的所有节点数据
以下是分别在ORACLE和MSSQL中的实现
如本例子中涉及的表
TB_SM_ORGAN(
ORG_ID int,
ORG_CODE varchar(20),
ORG_NAME varchar(40),
IS_INITDATA char(1),
ORG_PARENTID int,
ORG_TYPEID varchar(6),
ORG_AGENTID int,
ORG_STATUS char(3),
ORG_DESC varchar(200))
【ORACLE】
直接支持,使用SELECT * WHERE ..... START WITH ..... CONNECT BY 本节点ID=父节点ID
例如:
SELECT * FROM TB_SM_ORGAN where Org_Status = 'S0A' START WITH ORG_ID= @OrgId CONNECT BY PRIOR ORG_ID = ORG_PARENTID order by ORG_CODE
【MSSQL】
没有增强型SQL实现,需要使用临时表和循环多次查询的方式实现
create function GetOrganSubTreeByOrganID (@id int)
returns @t table(
ORG_ID int,
ORG_CODE varchar(20),
ORG_NAME varchar(40),
IS_INITDATA char(1),
ORG_PARENTID int,
ORG_TYPEID varchar(6),
ORG_AGENTID int,
ORG_STATUS char(3),
ORG_DESC varchar(200))
as
begin
insert @t select * from TB_SM_ORGAN where org_id = @id
while @@rowcount > 0
insert @t select a.* from TB_SM_ORGAN as a inner join @t as b
on a.org_parentid = b.org_id and a.org_id not in(select org_id from @t)
return
end
使用方法
SELECT * FROM GetOrganSubTreeByOrganID (ID);
出处: http://www.cnblogs.com/sunnyflat/articles/1173239.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架