递归查找 children
Find children recursively
我有一个 table 这样的:
创建脚本:
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
并且对于结果list 我必须找到它的 id_menu
是 20003, 20004, 20005
等的所有记录
我该怎么做?
也许这个会有所帮助
; 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
递归 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
我有一个 table 这样的:
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
并且对于结果list 我必须找到它的 id_menu
是 20003, 20004, 20005
等的所有记录
我该怎么做?
也许这个会有所帮助
; 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
递归 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