Sql server SQLServer2008:递归迭代操作

Sql server SQLServer2008:递归迭代操作,sql-server,sql-server-2008,Sql Server,Sql Server 2008,设想一个名为Group的表,每个组都可以有“子”组,只要它们的“级别”较低。所以组和子组表之间存在一对多关系 组和项之间也存在多对多关系,因此使用组\项来保存每个表的FK 我需要编写一个查询,其中对于给定的组密钥,我应该找到它的所有子组、子组的所有子组以及属于这些组的所有客户 我知道它需要某种递归查询,但我不知道如何在SQL中实现。以下是所讨论表格的结构: 因此,如果我在上表中设置了这些数据: 查询的目的是查找组1,查找其客户、子组及其子组和所有客户,输出应为: <Group> 1

设想一个名为Group的表,每个组都可以有“子”组,只要它们的“级别”较低。所以组和子组表之间存在一对多关系

组和项之间也存在多对多关系,因此使用组\项来保存每个表的FK

我需要编写一个查询,其中对于给定的组密钥,我应该找到它的所有子组、子组的所有子组以及属于这些组的所有客户

我知道它需要某种递归查询,但我不知道如何在SQL中实现。以下是所讨论表格的结构:

因此,如果我在上表中设置了这些数据:

查询的目的是查找组1,查找其客户、子组及其子组和所有客户,输出应为:

<Group> 1
    <customer> 1
    <customer> 2
    <Group> 2
        <customer> 2
        <Group> 3
        <Group> 4

有人能告诉我怎么做吗?谢谢

我希望我能理解你的问题

;WITH Hierarchy (GroupID,ID,  ParentID
               ,hLevel
               ) AS
(
   -- Base case
   (
   Select  [Parent Key] as GroupID,NULL,NULL,0
   FROM Tree
   where [Parent Key]=1
   UNION
   SELECT
      [Child Key] as GroupID,
      [Child Key] as ID,
      [Parent Key] as ParentID
      ,1 as hLevel
   FROM Tree
   where [Parent Key]=1
   ) 

   UNION ALL

   -- Recursive step
   SELECT
      e.[Child Key] as GroupID,
      e.[Child Key],
      e.[Parent Key]
     ,eh.hLevel + 1
   FROM tree e
      INNER JOIN Hierarchy eh ON
         e.[Parent Key] = eh.ID
)


Select Distinct h.GroupID, c.Name,h.ParentID as ParentGroupID
from Hierarchy h
left join test c on h.GroupID=c.ID
更老的尝试是

Declare @Parent int
Declare @count int
Select @Parent=??

Select cast(ID as Int) as ID
into #tmp
from Tabelle where ParentID=@Parent

select @Count=0
While @Count<(Select Count(*) from #tmp)
   begin
   Select @Count=(Select Count(*) from #tmp)
   insert into #tmp Select Cast(ID as int) from Tabelle where ParentID in (Select ID from #tmp) and ID not in (Select ID from #tmp)
   end
Select * from #tmp
Drop table #tmp

感谢您的回答,但我不清楚递归部分将如何迭代给定组的子组,这些子组本身可以有自己的子组。例如,组ID 1将组ID 2作为子项,组ID 2将组ID 3和4作为子项。WITH语法非常有用,但我无法使其对所有子组和子组子组进行迭代。如果再次查询SELECT Distinct*FROM HIRSHIC hThanks-几个问题-1通常要获取组的子组,则组1必须执行SELECT*FROM groups join CHILDGOUPS on groups.key=childGroup.key其中Groups.key=1,这是在您的代码中完成的吗?2.树是否应该是组。我更新了原来的问题,澄清了一些事情。你能看看你的问题是否仍然成立吗?谢谢,我又做了一次修改,我不希望您期望以显示的格式输出,结果结构应该使您能够根据需要报告它。如果第二个网格显示Group和childGroup之间的关系,那么在我看来它不是一对多。两个孩子共享同一个父母:2,3,2,4。两个父母共用一个孩子:2,4,3,4。这当然是多对多。@AndriyM我用我现在的模式更新了这个问题-我只需要能够存储一个组的孩子,所以childGroup需要是一对多,其中一个组可以有任意数量的孩子,每个孩子都有一个家长。您认为我的模式在组和子组表关系方面是错误的吗?