获取SQL中的直接层次结构,而不包含搜索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

我有一个非常简单的名为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 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)-这非常便于对最终结果集进行排序。

非常感谢!这给了我想要的结果。