2016-09-24 3 views
-2

У меня есть таблица вроде этого:Найти дети рекурсивно

enter image description here сценарий создания:

CREATE #TableName TABLE (
    Id int, 
    Id_Group int, 
    Id_Menu int 
) 
INSERT INTO #TableName VALUES 
(1, 20005, 1014),(2, 20003, 1054),(3, 20005, 1058), 
(4, 20004, 1055),(5, 20004, 1056),(6, 20004, 1057), 
(7, 20003, 1053),(8, 1014, 0),(9, 20003, 1014), 
(10, 20003, 1052),(11, 20003, 1164),(12, 20003, 1065), 
(13, 20003, 1066),(14, 20003, 1067),(15, 20003, 1068), 
(16, 20004, 1014),(17, 50100, 20003),(18, 50200, 20003), 
(19, 50100, 20004),(20, 50200, 20004),(21, 50100, 20005), 
(22, 50200, 20005) 

я Id_Menu, например 1014 он должен найти записи, которые его id_menu должна равняться 1014, результат 20003, 20004, 20005 и для списка результатов я должен найти все записи, которые его id_menu с являются 20003, 20004, 20005 и т. Д.

Как я могу это сделать?

ответ

1

Рекурсивный CTE может сделать это для вас:

DECLARE @var int = 1014 

;WITH rec AS (
SELECT Id, 
     Id_Group, 
     Id_Menu, 
     1 as [level] 
FROM YourTable 
WHERE Id_Group = @var 
UNION ALL 
SELECT y.Id, 
     y.Id_Group, 
     y.Id_Menu, 
     r.[level]+1 
FROM YourTable y 
INNER JOIN rec r 
    ON r.Id_Group = y.Id_Menu 
) 

SELECT * 
FROM rec 

Выход:

Id Id_Group Id_Menu level 
8 1014  0  1 
1 20005  1014 2 
9 20003  1014 2 
16 20004  1014 2 
19 50100  20004 3 
20 50200  20004 3 
17 50100  20003 3 
18 50200  20003 3 
21 50100  20005 3 
22 50200  20005 3 
0

может быть это одна поможет

; with CTE as(
select Id_Group from YourTable where Id_Menu=1014) 
select c.Id_Group,y.Id_Menu from CTE c with(nolock) join YourTable y with(nolock) on c.Id_Group=y.Id_Group 
Смежные вопросы