0

単純な SQL Server 2008 再帰クエリを機能させようとしています。

次の例: http://msdn.microsoft.com/en-us/library/ms186243.aspx および SQL 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

結果セットを Id = 8 の行に制限しているため、ステートメントから WHERE 句を削除します。以下の最初のコメントに基づいて、あなたの要件を理解しました! 開始点として 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 が番号順に並んでいない場合に機能します。親行が常に番号順であることが保証されている場合はLevel、CTE で導入された列を省略し、Id代わりに bummi の回答に従って列を並べ替えることができます。

SQL フィドルの例: http://sqlfiddle.com/#!3/2af0c/4

于 2013-04-29T15:49:34.143 に答える