我有一张桌子:
Series ======== ID SeriesName ParentSeriesID
系列可以是“根”系列,(ParentSeriesID
为0或null)或者它可以有父系列。一个系列也可以是几个级别,即它的父级有一个父级,它有一个父级等。
如何通过它的ID和所有后代系列来查询表格以获得系列?
到目前为止,我已经尝试过:
SELECT child.*
FROM Series parent JOIN Series child ON child.ParentSeriesID = parent.ID
WHERE parent.ID = @ParentID
但是这只返回第一级子节点,我想要父节点和所有“下游”节点。我不确定如何从这里进步。
答案 0 :(得分:14)
如果您使用的是SQL Server 2005+,则可以使用公用表表达式
With Family As
(
Select s.ID, s.ParentSeriesId, 0 as Depth
From Series s
Where ID = @ParentID
Union All
Select s2.ID, s2.ParentSeriesId, Depth + 1
From Series s2
Join Family
On Family.ID = s2.ParentSeriesId
)
Select *
From Family
更多信息:
答案 1 :(得分:5)
我只是加强托马斯的工作。如果你需要获得层次结构的深度并且在这里得到parentid就是代码。
这与托马斯的工作差不多
。With Family As
(
Select s.ID, s.ParentSeriesId, 0 as Depth
From Series s
Where ID = @ParentID <--- this was removed if you intend to get all hierarchy of the record. You can retain this if you want
Union All
Select s2.ID, s2.ParentSeriesId < --- change to **Family.ParentID**, Depth + 1
From Series s2
Join Family
On Family.ID = s2.ParentSeriesId
)
Select *
From Family
这就是全部。我知道现在为时已晚,但我希望遇到这种情况的人可以帮助他们。感谢Thomas的原始代码。 :)
答案 2 :(得分:2)
利用sql server 2005及更高版本中提供的CTE
功能进行递归查询
USE AdventureWorks
GO
WITH Emp_CTE AS (
SELECT EmployeeID, ContactID, LoginID, ManagerID, Title, BirthDate
FROM HumanResources.Employee
WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID, e.ContactID, e.LoginID, e.ManagerID, e.Title, e.BirthDate
FROM HumanResources.Employee e
INNER JOIN Emp_CTE ecte ON ecte.EmployeeID = e.ManagerID
)
SELECT *
FROM Emp_CTE
GO
您可以在此处查看示例: