2012-08-24 120 views
9

在SQL服务器TSQL - while循环内选择?

好吧,我正在处理一个数据库表,其中行可以有父行,然后可以有父行自己的行。我需要选择根“行”。我不知道这样做的最好方法。

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

我知道,语法是可怕的,但我希望我给你的是什么我想acheive的想法。

+1

所以我猜有不止一个版本与'ParentReleaseId'等于零? – AakashM

+0

您是否在说新闻稿表是层次结构的,例如版本X有前任,然后该版本有自己的前任,等等?所以问题在于找到指定日期内发布的任何*后期*版本的* original *版本? –

+0

希望你在2005年或以后 - 你能证实吗? –

回答

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 
+0

DARN,与CTE一起打败我。干得好:) –

+0

谢谢,本周我在使用这些'算法':) –

+0

这个工作对于无限级别的工作吗? –

1

像这样

with cte as 
(
    select id,parent_id from t where [email protected] 
    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

+0

我认为CTE的锚定成员将不得不处理OP示例查询的日期约束,不是吗? –

+0

从我所了解的起始值之前选择,日期约束将在该选择。 –

0

使用安德拉什的方法,我编辑了最后的选择,直接给我root的版本号

01现在

我的问题是我想通过(在该代码905)所有@IDs运行,并加入每一个记录结果