获取SQL中的直接层次结构,而不包含搜索id的同级
我有一个非常简单的名为Types的表,它包含ID、ParentID和Name。我需要的是从一个ID中获取完整的层次结构,但不包括搜索ID的同级获取SQL中的直接层次结构,而不包含搜索id的同级,sql,select,ssms,recursive-query,Sql,Select,Ssms,Recursive Query,我有一个非常简单的名为Types的表,它包含ID、ParentID和Name。我需要的是从一个ID中获取完整的层次结构,但不包括搜索ID的同级 ;WITH cte AS ( SELECT ID, ParentID, [Name] FROM [Types] WHERE ID=246 UNION ALL SELECT t1.ID, t1.ParentID, t1.[Name] FROM [Types] t1 INNER JOIN cte ON
;WITH cte AS (
SELECT ID, ParentID, [Name]
FROM [Types]
WHERE ID=246
UNION ALL
SELECT t1.ID, t1.ParentID, t1.[Name]
FROM [Types] t1
INNER JOIN cte ON cte.ID=t1.ParentID
)
SELECT * FROM cte
这为我提供了表的完整层次结构(最上面的父级为id“246”):
到目前为止,一切顺利。我现在想从查询中得到的是ID:1384的完整层次结构,但没有ID 1384的兄弟姐妹(以及兄弟姐妹的子女、孙子女等)。因此,它应该返回以下结果:
+------+----------+------------------+
| ID | ParentID | Name |
+------+----------+------------------+
| 246 | 2 | Approvals |
+------+----------+------------------+
| 1384 | 246 | ProductStatus |
+------+----------+------------------+
| 1517 | 1384 | NewStatus |
+------+----------+------------------+
| 1520 | 1384 | NewSiblingStatus |
+------+----------+------------------+
| 1519 | 1517 | NewNewStatus |
+------+----------+------------------+
我读过关于检索层次结构的各种文章,但到目前为止还没有解决这个问题,也没有发现有人有类似的问题。一种方法是使用两个递归公共表表达式。一个去找父母,另一个去找孩子。然后,您可以
联合
它们以获得所需的结果-联合
(而不是联合所有
)旨在消除初始节点上的重复
WITH
cte_children AS (
SELECT ID, ParentID, [Name], 0 lvl
FROM [Types]
WHERE ID = 1384
UNION ALL
SELECT t.ID, t.ParentID, t.[Name], lvl - 1
FROM [Types] t
INNER JOIN cte_children c ON c.ID = t.ParentID
)
cte_parents AS (
SELECT ID, ParentID, [Name], 0 lvl
FROM [Types]
WHERE ID = 1384
UNION ALL
SELECT t.ID, t.ParentID, t.[Name], lvl + 1
FROM [Types] t
INNER JOIN cte ON cte.ParentID = t.ID
)
SELECT * FROM cte_parents
UNION
SELECT * FROM cte_children
ORDER BY lvl
请注意,我在查询中添加了一个名为
lvl
的列,该列计算每个节点的深度(初始注释为0
,父节点为负lvl
s,子节点为正lvl
s)-这非常便于对最终结果集进行排序。非常感谢!这给了我想要的结果。