我有一个表格(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
无论我查询的层次有多深,我总是需要根元素和第一个子元素。如果您考虑这棵树,无论我在树的哪个深度,我总是需要红色和蓝色的元素。
我可以像这样获取“root”状态:
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
我应该如何从那里向上遍历?从根节点获取树中的下一个子节点?还是反过来 - 获取根节点以及第一层级。递归让我很困惑。
CASE
语句,比如CASE WHEN uh.Level = 0 THEN ObjectStates.ID ELSE null END AS firstchild
,但这并不起作用,因为它不能将子节点进一步传递到树下方。 - Dennis G