我有一个表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和查询中的条件可能不同。
答案 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
)