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