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
)
我有一个 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 来做到这一点。
它与
您可以使用带递归的通用 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
)