TSQL - 在select中循环?

时间:2012-08-24 13:08:29

标签: sql-server sql-server-2008 tsql while-loop

在SQL server

好的,所以我正在使用一个数据库表,其中行可以有父行,然后可以拥有自己的父行。我需要选择根'row'。我不知道最好的方法。

有一个名为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

我知道语法很糟糕,但希望我能告诉你我想要实现的目标。

3 个答案:

答案 0 :(得分:9)

这是一个可能有用的例子:

此查询获取树的下部元素,并搜索父项的父级。 就像我的表中有4级 - &gt;类别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

答案 1 :(得分: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

答案 2 :(得分: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)并将每条记录连接到结果