我在表格中的示例数据如下:
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个级别,我如何获取树数据的中间部分?
提前感谢所有
答案 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 )