Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL递归查询只返回最后一行_Sql Server_Sql Server 2008_Recursive Query - Fatal编程技术网

Sql server SQL递归查询只返回最后一行

Sql server SQL递归查询只返回最后一行,sql-server,sql-server-2008,recursive-query,Sql Server,Sql Server 2008,Recursive Query,我正在尝试让简单的SQLServer2008递归查询正常工作 以下是这些例子: 和 我有一个带有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 re

我正在尝试让简单的SQLServer2008递归查询正常工作

以下是这些例子: 和

我有一个带有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
但我只得到最后一个。 提前谢谢

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 


从语句中删除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 FIDLE示例:

从语句中删除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 FIDLE示例:

您是否尝试忽略Where子句?它特别指出,您将只获取最后一行。@DaveJohnson,如果我删除其中的ID=8,我将获取表中的每一行。CTE中所选列的名称与示例表中列的名称不匹配!列名已修复。是否尝试忽略Where子句?它特别指出,您将只获取最后一行。@DaveJohnson,如果我删除其中的ID=8,我将获取表中的每一行。CTE中所选列的名称与示例表中列的名称不匹配!列名固定感谢但如果我删除Id=8的位置,它如何找到起点?太好了,非常感谢,它们是按数字顺序排列的,但我会使用你的级别来确保安全。但是如果我删除Id=8的位置,它如何找到起点?太好了,非常感谢,它们是按数字顺序排列的,但我会用你的等级来保证安全。