Sql 从表中选择层次结构
我有一个表ServiceItem,它具有Id、ParentId和一些属性,如名称、描述等。层次结构的最大级别为2。我需要一个查询来选择具有某些条件的行,例如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 *
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
)