从表中选择层次结构

时间:2016-12-30 07:59:34

标签: sql sql-server tsql hierarchical-data recursive-query

我有一个表ServiceItem,它有Id,ParentId和一些属性,如Name,Description等。最高级别的层次结构是2.我需要一个选择具有某些条件的行的查询,例如Name = '123'及其父行,以获得类似于:

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'

    )

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

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

2 个答案:

答案 0 :(得分:3)

您可以将公用表表达式与递归一起使用:

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

答案 1 :(得分:0)

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
    )