SQL Server递归函数获取中间数据树
我在表中有如下示例数据:SQL Server递归函数获取中间数据树,sql,sql-server,performance,Sql,Sql Server,Performance,我在表中有如下示例数据: id, name , parentid -------------------- 1 , jason , null 2 , john , 1 3 , abe , 2 4 , mary , 2 5 , yong , 4 6 , albert, 5 7 , jane , 3 8 , alex , 7 如果我只需要SQL Server中所选parentid示例john、abe、mary、jane中的两个级别,如何获取树数据的中间部分 提前感谢大家这将为您提
id, name , parentid
--------------------
1 , jason , null
2 , john , 1
3 , abe , 2
4 , mary , 2
5 , yong , 4
6 , albert, 5
7 , jane , 3
8 , alex , 7
如果我只需要SQL Server中所选parentid示例john、abe、mary、jane中的两个级别,如何获取树数据的中间部分
提前感谢大家这将为您提供所需:
WITH CTE
AS(
SELECT ID,Name,parentID, 1 Depth FROM YourTable
UNION ALL
SELECT E.ID,E.Name,E.ParentID,Depth+1 Depth FROM YourTable E
INNER JOIN CTE ON E.ParentID=CTE.ID)
SELECT * FROM CTE
WHERE Depth = 2
请注意,第二个select中的where子句获取深度,答案假设您正在查找第二个级别。检查此查询:刚刚选择了当前父级的子级和子级的子级
DECLARE @SelectedID INT
SET @SelectedID = 1
SELECT ID, NAME, PARENTID FROM #TABLE1 WHERE PARENTID = @SelectedID
UNION ALL
SELECT ID, NAME, PARENTID FROM #TABLE1 WHERE PARENTID IN
(SELECT ID FROM #TABLE1 WHERE PARENTID = @SelectedID)
UNION ALL
SELECT ID, NAME, PARENTID FROM #TABLE1 WHERE PARENTID IN
(SELECT ID FROM #TABLE1 WHERE PARENTID IN
(SELECT ID FROM #TABLE1 WHERE PARENTID = @SelectedID))
我创建了一个存储过程,以实现基于使用的输入获取childs
只需运行SP,然后将表名Table1更改为表名
CREATE PROCEDURE GetChilds(@SelectedID INT, @SelectedLevel INT)
AS
BEGIN
DECLARE @CurrentLevel INT
SET @CurrentLevel = 0
CREATE TABLE #TABLENew(ID INT, NAME VARCHAR(20), PARENTID INT, Level INT)
CREATE TABLE #TABLETemp1(ID INT)
CREATE TABLE #TABLETemp2(ID INT)
INSERT INTO #TABLETemp1(ID)
SELECT ID FROM #TABLE1 WHERE PARENTID = @SelectedID
INSERT INTO #TABLENew (ID, NAME, PARENTID, Level)
SELECT ID, NAME, PARENTID, @CurrentLevel FROM #TABLE1 WHERE PARENTID IN(@SelectedID)
SET @CurrentLevel = @CurrentLevel + 1
INSERT INTO #TABLETemp2(ID)
SELECT ID FROM #TABLETemp1
WHILE (@CurrentLevel <= @SelectedLevel)
BEGIN
INSERT INTO #TABLENew (ID, NAME, PARENTID, Level)
SELECT ID, NAME, PARENTID, @CurrentLevel FROM #TABLE1 WHERE PARENTID IN(SELECT ID FROM #TABLETemp1)
TRUNCATE TABLE #TABLETemp1
INSERT INTO #TABLETemp1(ID)
SELECT ID FROM #TABLE1 WHERE PARENTID IN(SELECT ID FROM #TABLETemp2)
TRUNCATE TABLE #TABLETemp2
INSERT INTO #TABLETemp2(ID)
SELECT ID FROM #TABLETemp1
SET @CurrentLevel = @CurrentLevel + 1
END
SELECT * FROM #TABLENew
DROP TABLE #TABLENew
DROP TABLE #TABLETemp1
DROP TABLE #TABLETemp2
END
试试这个
declare @parentID int;
declare @level int;
set @parentID = 1;
set @level = 2;
select name FROM TestTable123414 where parentid between @parentID and @parentID+@level
输出
您说过希望从选定的父级获得2级。对于父1-两个级别节点是2,3,4,5,6,但在您的问题中,您提到了john、abe、mary和jane,那么yong5在哪里。如果我错了。用例子解释。哦,是的,谢谢你忘记了yonghi是的,这是我正在寻找的,但是如果我允许用户选择1、2或4级,是否可以提供动态级别示例的代码?我知道你想要什么。请稍等片刻。我正在努力。看看答案。更新你所得到的。天哪,你是我想要的100%的救世主,如果你现在就在我身边,我会给你买一杯饮料检查此链接:
declare @parentID int;
declare @level int;
set @parentID = 1;
set @level = 2;
select name FROM TestTable123414 where parentid between @parentID and @parentID+@level
john
abe
mary
jane
declare @test table(id int, name varchar(50), parentid int)
insert into @test values
( 1,'jason' , null ),
( 2,'john' , 1),
( 3,'abe' , 2),
( 4,'mary' , 2),
( 5,'yong' , 4),
( 6,'albert' , 3),
( 7,'jane' , 3),
( 8,'alex' , 7)
declare @level int, @currentid int;
set @level = 2;
set @currentid = 1
select * from @test where parentid in (
select id from @test where id between @currentid and @currentid+@level )