Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server递归函数获取中间数据树_Sql_Sql Server_Performance - Fatal编程技术网

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 )