9

在 SQL 服务器中

好的,所以我正在使用一个数据库表,其中行可以有父行,然后可以有自己的父行。我需要选择根“行”。我不知道做到这一点的最佳方法。

有一个名为 ParentId 的字段,它将行链接到具有该 ID 的行。当 ParentId = 0 时,它是根行。

这是我现在的查询:

SELECT Releases.Name,WorkLog.WorkLogId 

FROM WorkLog,Releases
WHERE
Releases.ReleaseId = WorkLog.ReleaseId
and WorkLogDateTime >= @StartDate
and WorkLogDateTime <= @end

我真的不需要子版本的版本名称,我只想要根版本名称,所以我想选择这样的 While 循环的结果:

WHILE (ParentReleaseId != 0)
BEGIN
@ReleaseId = ParentReleaseId
END

Select Release.Name
where Release.RealeaseId = @ReleaseId

我知道语法很糟糕,但希望我能让您了解我想要实现的目标。

4

3 回答 3

9

这是一个示例,可能很有用:

此查询正在获取树的较低元素,并搜索到父​​母的父母。就像我的表中有 4 个级别 -> 类别 7->5、5->3、3-> 1。如果我将其分配给 5,它将找到 1,因为这是三个级别中的最高级别。

(更改最后一个选择,您可以让所有的父母都在路上。)

DECLARE @ID int

SET @ID = 5;

WITH CTE_Table_1
(
  ID,
  Name,
  ParentID
)
AS(
  SELECT 
   ID,
   Name,
   ParentID
  FROM Table_1
  WHERE ID = @ID

 UNION ALL

 SELECT 
  T.ID,
  T.Name,
  T.ParentID
 FROM Table_1 T
 INNER JOIN CTE_Table_1 ON CTE_Table_1.ParentID = T.ID
)

SELECT * FROM CTE_Table_1 WHERE ParentID = 0
于 2012-08-24T13:20:11.420 回答
1

像这样的东西

with cte as
(
  select id,parent_id from t where t.id=@myStartingValue
  union all
  select t.id,t.parent_id
  from cte
  join t on cte.parent_id = t.id where cte.parent_id<>0
 )
select * 
from cte
join t on cte.id=t.id where cte.parent_id = 0

和小提琴:http ://sqlfiddle.com/#!3/a5fa1/1/0

于 2012-08-24T13:23:40.253 回答
0

使用 Andras 方法,我编辑了最终选择以直接给我根版本的 ID

WITH cte_Releases
( 
  ReleaseId, 
  ParentReleaseID 
) 
AS( 
  SELECT  
   ReleaseId, 
   ParentReleaseID 
  FROM Releases
  Where ReleaseId = 905

 UNION ALL 

 SELECT  
  R.ReleaseId, 
  R.ParentReleaseID 
 FROM Releases R
 INNER JOIN cte_Releases ON cte_Releases.ParentReleaseID = R.ReleaseId
) 

SELECT max(ReleaseId) as ReleaseId, min(ReleaseId) as RootReleaseId FROM cte_Releases

我现在的问题是我想遍历所有@ID(该代码中的 905)并将每条记录加入结果

于 2012-08-24T14:30:33.530 回答