Select 层级来自 table

Select hierarchy from table

我有一个 table ServiceItem,它有 Id、ParentId 和一些属性,如 Name、Description 等等。层次结构的最大级别为 2。我需要一个查询来选择具有某些条件的行,例如 Name = '123' 及其父行以获取 smth,如:

Id  ParentId  Name
1   NULL      '12' 
2   1         '123'

我试过这个:

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'

    )

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

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

您可以使用带递归的通用 Table 表达式:

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

有关更深入的示例,请参阅 this Q&A

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

这是一个很好的查询,但我也找到了这个:

SELECT
    *
FROM ServiceItem si
WHERE si.Name  = '123'
    OR EXISTS (
        SELECT
            *
        FROM ServiceItem si2
        WHERE si2.Name = '123'
            and si2.ParentId = si.Id
    )