2013-04-29 156 views
0

我想讓簡單的SQL Server 2008遞歸查詢工作。SQL遞歸查詢只返回最後一行

下面這些例子: http://msdn.microsoft.com/en-us/library/ms186243.aspxSQL Server recursive query

我有一個表,通過ID和的parentID:

ID fParent fName 
2 NULL  root 
3 2  Drug_Error 
4 2  Incident 
5 4  2007 
6 4  2009 
7 5  2007-1 
8 7  2008-2 

用下面的查詢

with recury as (
Select 
fs1.ID ,fs1.FParent,fs1.FName 
from FoldersStructure as fs1 
where fs1.FParent =null 
union all 
select fs2.id,fs2.FParent,fs2.FName 
from FoldersStructure as fs2 
inner join recury as r on fs2.FParent= r.ID 
) 
select ID,FParent,FName 
from recury 
where ID=8 

我希望得到:

2 null root 
4 2  incident 
5 4  2007 
7 5  2007-1 
8 7  2007-2 

但我只得到最後一個。 在此先感謝。

+2

你試過忽略你的Where子句?它具體說你只會得到最後一行。 – 2013-04-29 15:46:41

+0

@DaveJohnson,如果我刪除ID = 8的地方,我會得到表中的每一行。 – Lambda 2013-04-29 16:00:11

+0

在CTE中選擇的列的名稱與示例表中列的名稱不匹配! – 2013-04-29 16:18:43

回答

2

從語句中刪除WHERE子句,因爲它限制了結果集到基於下面的第一個評論ID = 8行,我現在明白你的要求!以8爲起點並檢索所有父行:

WITH recury (Id, ParentId, Name, Level) AS 
(
    SELECT fs1.Id ,fs1.ParentId,fs1.Name, CONVERT(int, 0) 
    FROM FoldersStructure AS fs1 
    WHERE fs1.Id = 8 
    UNION ALL 
    SELECT fs2.Id,fs2.ParentId,fs2.Name, Level - 1 
    FROM FoldersStructure AS fs2 
    JOIN recury AS r ON fs2.Id = r.ParentId 
) 
SELECT Id, ParentId, Name, Level 
FROM recury 
ORDER BY Level; 

如果父行的ID不是數字順序,則此代碼將可用。如果您的父行始終保證爲數字順序,則可以省略CTE中引入的Level列,並根據bummi的答案對Id列進行排序。

SQL小提琴例如:http://sqlfiddle.com/#!3/2af0c/4

+0

但如果我刪除了Id = 8的地方,它如何找到起點? – Lambda 2013-04-29 16:03:00

+0

@Lambda:我已經更新了我的回答以迴應您的評論。 – 2013-04-29 16:17:04

+0

偉大的工作太多,非常感謝,他們在數字順序但我會用你的水平是安全的。 – Lambda 2013-04-29 16:37:12

4
with recury as (
Select 
fs1.ID ,fs1.FParent,fs1.FName 
from FoldersStructure as fs1 
where fs1.ID=8 

union all 
select fs2.id,fs2.FParent,fs2.FName 
from FoldersStructure as fs2 
inner join recury as r on fs2.ID= r.FParent 

) 
select ID,FParent,FName 
from recury 
order by ID 

SQL-Fiddle

+0

謝謝,你救了我的一天,你的權利它的fs2.ID = r.FParent – Lambda 2013-04-29 16:27:51