Sql 从表中选择层次结构

Sql 从表中选择层次结构,sql,sql-server,tsql,hierarchical-data,recursive-query,Sql,Sql Server,Tsql,Hierarchical Data,Recursive Query,我有一个表ServiceItem,它具有Id、ParentId和一些属性,如名称、描述等。层次结构的最大级别为2。我需要一个查询来选择具有某些条件的行,例如Name='123'及其父行,以获得smth,如: Id父Id名称 1空'12' 2 1 '123' 我试过这个: SELECT * FROM ServiceItem si WHERE si.Name = '123' OR EXISTS ( SELECT *

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

Id父Id名称
1空'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来完成它


它不同于,因为我需要获取一组行,不仅路径Id和查询中的条件可能不同。

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

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
    )

可能重复的@a_horse_,没有名字不,这不是我要找的。可能重复的。您必须修改查询,以从树的底部而不是顶部启动树,但其语法基本相同。然后指定预期的输出。按照您描述的方式,您正在寻找递归CTE。
SELECT
    *
FROM ServiceItem si
WHERE si.Name  = '123'
    OR EXISTS (
        SELECT
            *
        FROM ServiceItem si2
        WHERE si2.Name = '123'
            and si2.ParentId = si.Id
    )