0

我试图让简单的 SQL Server 2008 递归查询工作。

按照这些示例: http: //msdn.microsoft.com/en-us/library/ms186243.aspxSQL Server 递归查询

我有一个表,带有 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

但我只得到最后一个。提前致谢。

4

2 回答 2

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小提琴

于 2013-04-29T15:49:06.687 回答
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 不是数字顺序,则此代码将起作用。如果您的父行始终保证按数字顺序排列,您可以省略LevelCTE 中引入的列,并Id按照 bummi 的回答对列进行排序。

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

于 2013-04-29T15:49:34.143 回答