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