在层次结构中向下填充顶级详细信息
Fill top level details down hierarchy
我想在层次结构中填充顶级详细信息。我有两张桌子。
主表
+-----+------+--------+
| ID | Name | NodeID |
+-----+------+--------+
| 1 | A | 1 |
+-----+------+--------+
| 2 | B | 2 |
+-----+------+--------+
| 3 | C | 3 |
+-----+------+--------+
关系表
+----+---------+----------+
| ID | ChildID | ParentID |
+----+---------+----------+
| 1 | 11 | 1 |
+----+---------+----------+
| 2 | 12 | 11 |
+----+---------+----------+
| 3 | 13 | 12 |
+----+---------+----------+
| 4 | 21 | 2 |
+----+---------+----------+
| 5 | 22 | 21 |
+----+---------+----------+
我想要输出如下:
+------+--------+---------+----------+
| Name | NodeID | ChildID | ParentID |
+------+--------+---------+----------+
| A | 1 | 11 | 1 |
+------+--------+---------+----------+
| A | 1 | 12 | 11 |
+------+--------+---------+----------+
| A | 1 | 13 | 12 |
+------+--------+---------+----------+
| B | 2 | 21 | 2 |
+------+--------+---------+----------+
| B | 2 | 22 | 21 |
+------+--------+---------+----------+
我已经使用 CTE 编写了递归 SQL,但它没有给出预期的结果。
;WITH relation_cte (childid, parentid)
AS (SELECT childid,
parentid
FROM @RelationTable AS RT1
INNER JOIN @MainTable AS MT
ON MT.nodeid = RT1.parentid
UNION ALL
SELECT RT2.childid,
RT2.parentid
FROM @RelationTable AS RT2
INNER JOIN relation_cte AS REL_CTE
ON REL_CTE.childid = RT2.parentid)
SELECT MT.managername, MT.nodeid, REL_CTE.childid, REL_CTE.parentid
FROM relation_cte AS REL_CTE
LEFT OUTER JOIN @MainTable AS MT
ON MT.nodeid = REL_CTE.parentid
有人可以帮我 SQL 吗?谢谢
将 TopLevelId 列添加到 CTE 并且不要忘记 ORDER BY 子句:
;WITH relation_cte (childid, parentid, toplevelid) AS (
SELECT
RT1.childid,
RT1.parentid,
MT.nodeid
FROM
@RelationTable AS RT1
INNER JOIN @MainTable AS MT ON MT.nodeid = RT1.parentid
UNION ALL
SELECT
RT2.childid,
RT2.parentid,
REL_CTE.toplevelid
FROM
@RelationTable AS RT2
INNER JOIN relation_cte AS REL_CTE ON REL_CTE.childid = RT2.parentid
)
SELECT
MT.name, REL_CTE.toplevelid, REL_CTE.childid, REL_CTE.parentid
FROM
relation_cte AS REL_CTE
LEFT OUTER JOIN @MainTable AS MT ON MT.nodeid = REL_CTE.toplevelid
ORDER BY 2
我想在层次结构中填充顶级详细信息。我有两张桌子。
主表
+-----+------+--------+ | ID | Name | NodeID | +-----+------+--------+ | 1 | A | 1 | +-----+------+--------+ | 2 | B | 2 | +-----+------+--------+ | 3 | C | 3 | +-----+------+--------+
关系表
+----+---------+----------+ | ID | ChildID | ParentID | +----+---------+----------+ | 1 | 11 | 1 | +----+---------+----------+ | 2 | 12 | 11 | +----+---------+----------+ | 3 | 13 | 12 | +----+---------+----------+ | 4 | 21 | 2 | +----+---------+----------+ | 5 | 22 | 21 | +----+---------+----------+
我想要输出如下:
+------+--------+---------+----------+ | Name | NodeID | ChildID | ParentID | +------+--------+---------+----------+ | A | 1 | 11 | 1 | +------+--------+---------+----------+ | A | 1 | 12 | 11 | +------+--------+---------+----------+ | A | 1 | 13 | 12 | +------+--------+---------+----------+ | B | 2 | 21 | 2 | +------+--------+---------+----------+ | B | 2 | 22 | 21 | +------+--------+---------+----------+
我已经使用 CTE 编写了递归 SQL,但它没有给出预期的结果。
;WITH relation_cte (childid, parentid) AS (SELECT childid, parentid FROM @RelationTable AS RT1 INNER JOIN @MainTable AS MT ON MT.nodeid = RT1.parentid UNION ALL SELECT RT2.childid, RT2.parentid FROM @RelationTable AS RT2 INNER JOIN relation_cte AS REL_CTE ON REL_CTE.childid = RT2.parentid) SELECT MT.managername, MT.nodeid, REL_CTE.childid, REL_CTE.parentid FROM relation_cte AS REL_CTE LEFT OUTER JOIN @MainTable AS MT ON MT.nodeid = REL_CTE.parentid
有人可以帮我 SQL 吗?谢谢
将 TopLevelId 列添加到 CTE 并且不要忘记 ORDER BY 子句:
;WITH relation_cte (childid, parentid, toplevelid) AS (
SELECT
RT1.childid,
RT1.parentid,
MT.nodeid
FROM
@RelationTable AS RT1
INNER JOIN @MainTable AS MT ON MT.nodeid = RT1.parentid
UNION ALL
SELECT
RT2.childid,
RT2.parentid,
REL_CTE.toplevelid
FROM
@RelationTable AS RT2
INNER JOIN relation_cte AS REL_CTE ON REL_CTE.childid = RT2.parentid
)
SELECT
MT.name, REL_CTE.toplevelid, REL_CTE.childid, REL_CTE.parentid
FROM
relation_cte AS REL_CTE
LEFT OUTER JOIN @MainTable AS MT ON MT.nodeid = REL_CTE.toplevelid
ORDER BY 2