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

最近工作中,经常用到根据当前树节点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,



                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值