MSSQL 获取无限级表中父节点ID

本文分享了一个SQL查询技巧,用于在树形数据结构中找到任意节点的顶级父节点及层级关系。通过示例代码演示了如何使用递归查询来实现这一功能。

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

最近工作中,经常用到根据当前树节点ID获取最顶级父节点ID的操作。今天整理了一下,将SQL贴在下面,以防他日急用!

希望看到的人也能在学习过程中收益。如果有哪里不妥或需要改进的地方,希望能够斧正。谢谢!


DROP TABLE TREE
GO
CREATE TABLE TREE
(
PKID INT IDENTITY(1,1) ,
ParentID INT 
)
GO
INSERT INTO TREE VALUES(0)
INSERT INTO TREE VALUES(1)
INSERT INTO TREE VALUES(2)
INSERT INTO TREE VALUES(3)
INSERT INTO TREE VALUES(4)
INSERT INTO TREE VALUES(5)
INSERT INTO TREE VALUES(6)
INSERT INTO TREE VALUES(7)
INSERT INTO TREE VALUES(8)
INSERT INTO TREE VALUES(9)
INSERT INTO TREE VALUES(10)
INSERT INTO TREE VALUES(11)
GO


select * from TREE


go
--根据任意底级的子节点,找出最顶级父节点
DECLARE @DeptID  INT SET @DeptID=12  --传入的部门ID
DECLARE @PDeptID INT                  --父类部门ID
SELECT @PDeptID=ParentID FROM TREE WHERE PKID=@DeptID
IF(@PDeptID=0)
SELECT @DeptID
ELSE
DECLARE @NDeptID INT   --临时变量
WHILE(@PDeptID<>0)
BEGIN
SET @NDeptID=@PDeptID
SELECT @PDeptID=ParentID FROM TREE WHERE PKID=@PDeptID
END
SELECT PKID FROM TREE WHERE PKID=@NDeptID


--结果如下:1


GO


--根据顶级父节点,取出第二级下,第一个子节点,依次类推,(无限极)
DECLARE @DeptID  INT SET @DeptID=12  --传入的部门ID
DECLARE @PDeptID INT                  --父类部门ID
DECLARE @Nums int
SELECT @PDeptID=PKID FROM TREE WHERE PKID=@DeptID
SELECT @Nums=count(1) FROM TREE WHERE ParentID=@PDeptID
IF(@Nums=0)
SELECT PKID FROM TREE WHERE PKID=@PDeptID
ELSE
BEGIN
	WHILE(@Nums>0)
	BEGIN
	SELECT TOP 1 @PDeptID=PKID FROM TREE WHERE ParentID=@PDeptID
	SELECT @Nums=count(1) FROM TREE WHERE ParentID=@PDeptID
	END
	SELECT PKID FROM TREE WHERE PKID=@PDeptID
END

GO

--根据任意底级的子节点,找出有直接关系的节点结合
DECLARE @DeptIds NVARCHAR(4000)
DECLARE @DeptID  INT 
SET @DeptID=12
SET @DeptIds='12,'  --传入的部门ID  
DECLARE @PDeptID INT                  --父类部门ID  
SELECT @PDeptID=ParentID,@DeptIds=@DeptIds+ LTRIM(STR(ParentID))+',' FROM TREE WHERE PKID=@DeptID  
IF(@PDeptID=0)  
SELECT @DeptID  
ELSE  
DECLARE @NDeptID INT   --临时变量  
WHILE(@PDeptID<>0)  
BEGIN  
SET @NDeptID=@PDeptID  
SET @DeptIds=@DeptIds+LTRIM(STR(@PDeptID))+','
SELECT @PDeptID=ParentID FROM TREE WHERE PKID=@PDeptID  
END  
SELECT @DeptIds
--结果如下: 12,11,11,10,9,8,7,6,5,4,3,2,1,




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值