欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Sql Server获取指定ID的所有父节点ID

程序员文章站 2022-06-01 22:41:17
...

数据库结构

ID Pid
1 0
2 1
3 2
4 2
5 1

Sql

if exists (select * from sys.procedures where name='GetPidByID')
	drop procedure GetPidByID
go
create procedure  GetPidByID
(
@ID int
)
as
declare @resultTable table(Pid int)--结果表
declare @selectTable table(ID int)--每一次查询结果表
declare @whereTable table(ID int)--上一次条件查询表
insert @whereTable values(@ID)--添加查询条件

while 1=1 --进入循环,不由它控制循环结束
begin
	insert into @selectTable
	select t.Pid from [表名] t join @whereTable r on t.ID=r.ID group by t.pid --按上一次条件查询表进行查询pid
	
	if  not exists(select * from @selectTable where ID = 0) and exists(select * from @selectTable) --判断是否查到根节点pid=0,或者无数据
	begin
		--没有到根节点
		insert into @resultTable select * from @selectTable --将本次查询结果添加到结果表中
		delete @whereTable --删除上一次条件查询表中的数据
		insert into @whereTable select * from @selectTable --将本次查询结果添加到上一次条件查询表中,以便下次查询
	end
	else
		break--到达根节点,退出循环
end
select * from @resultTable group by pid --除去重复数据

------储存过程在此截止------
--执行
exec GetPidByID 4