SQL Server递归函数获取中间数据树

时间:2014-11-18 04:43:09

标签: 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的2个级别,我如何获取树数据的中间部分?

提前感谢所有

4 个答案:

答案 0 :(得分:0)

这可以满足您的需求:

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

注意第二个选择中的where子句获取深度,答案假定您正在寻找第二个级别。

答案 1 :(得分:0)

检查此查询:刚刚选择了当前父母和孩子的孩子。

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))

我创建了一个存储过程,以根据使用的输入实现获取子项。

只需运行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

执行结果。(1 - 父级,2级)

EXEC GetChilds 1, 2

答案 2 :(得分:0)

试试这个..

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

答案 3 :(得分:0)

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 )