我有下表(ObjectStates)并且想要获取根以及根的第一个孩子:
ID Title ParentID
1 Draft null
2 Green null
3 Red null
4 Foo 1
5 Bar 4
6 Some1 1
7 Some2 6
8 XYZ 2
9 Some3 7
我想要以下输出:
GetState(5)
-- returns root: 1, first-child: 4
GetState(6)
-- returns root: 1, first-child: 6
GetState(7)
-- returns root: 1, first-child: 6
GetState(9)
-- returns root: 1, first-child: 6
GetState(8)
-- returns root: 2, first-child: 8
所以无论我查询的层次结构有多深——我总是想要根元素以及第一个子元素。如果你考虑这棵树,我总是想要红色和蓝色元素,不管我在树里有多深。
我可以像这样获得“根”状态:
WITH CTEHierarchy
AS (
SELECT
ID
,0 AS LEVEL
,ID AS root
FROM ObjectStates
WHERE ParentID IS NULL
UNION ALL
SELECT
ObjectStates.ID
,LEVEL + 1 AS LEVEL
,[root]
FROM ObjectStates
INNER JOIN CTEHierarchy uh ON uh.id = ObjectStates.ParentID
)
SELECT [root]
FROM CTEHierarchy
WHERE ID = @ObjectStateID
这给了我我想要的根结果:
GetState(5)
-- returns root: 1
GetState(9)
-- returns root: 1
GetState(2)
-- returns root: 2
我怎样才能从那里穿越?那么从根获取树中的下一个孩子?或者反过来 - 获取根以及第一级。递归让我头疼。