从表中选择层次结构

Dim*_*dko 4 sql t-sql sql-server recursive-query hierarchical-data

我有一个表 ServiceItem,其中包含 Id、ParentId 和一些属性,例如名称、描述等。层次结构的最大级别为 2。我需要一个查询来选择具有某些条件的行,例如Name = '123'及其父行,以获得如下结果:

Id  ParentId  Name
1   NULL      '12' 
2   1         '123'
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这个:

SELECT
    *
FROM ServiceItem si
WHERE si.Name = '123'
    OR EXISTS (
        SELECT
            *
        FROM ServiceItem syst
            JOIN ServiceItem si2
                ON si2.ParentId = syst.Id
        WHERE syst.Id = si.ParentId
            AND si2.Name = '123'

    )
Run Code Online (Sandbox Code Playgroud)

但它返回父级及其所有子级。有没有机会通过一个查询来完成它?我正在使用 T-SQL 来做到这一点。

它与这个问题不同,因为我需要获取一堆行,不仅是路径 ID,而且查询中的条件可能不同。

tri*_*cot 5

您可以使用带有递归的公共表表达式:

WITH cte AS
  (
    SELECT     *
    FROM       ServiceItem
    WHERE      Name = '123'
    UNION ALL
    SELECT     *
    FROM       ServiceItem si
    INNER JOIN cte
            ON cte.ParentId = si.Id
  )
SELECT * FROM cte
Run Code Online (Sandbox Code Playgroud)

有关更深入的示例,请参阅此问答