2013-02-18 100 views
0

给孩子的名单独特的父母我有一个包含一个表heirarchical数据:如何获得一组SQL

ID Name  ParentID 
--- --------- --------- 
1 Alpha  2 
2 Beta  3 
3 Gamma  NULL 
4 Delta  2 
5 Epsilon 6 
6 Zeta  NULL 
7 Eta  1 
8 Theta  NULL 

鉴于ID的列表,我如何让所有的唯一根列表父母ID?我不想要中间父母。

例如,假设我给出的ID列表是1, 2, 3, 4, 5。 我找的结果是:

ID 
--- 
3 
6 

显然这需要某种形式的递归查询。我认为使用通用表格表达式(CTE)可能是可能的,但是我真的很费力地围绕它如何完成。到目前为止,我所看到的所有例子似乎都将所有的孩子和父母聚合在一起,以产生一个完整的习惯性列表,这不是我正在寻找的。有没有任何SQL专家可以让我在正确的方向推动?我意识到我可以迭代地对数据库进行多重查询,但我希望不必诉诸于此。

我应该注意到我正在使用SQL Server 2008.

+0

与此类似,http://stackoverflow.com/questions/14940489/find-contact-in-location-tree/14941396#14941396 – Kaf 2013-02-18 17:43:25

回答

2

下面是一个示例。 CTE从孩子向父母递归。

; with Cte as 
     (
     select ID 
     ,  ParentID 
     from Table1 
     where ID in (1, 2, 3, 4, 5) 
     union all 
     select parent.ID 
     ,  parent.ParentID 
     from Table1 parent 
     join Cte child 
     on  child.ParentID = parent.ID 
     ) 
select distinct ID 
from Cte 
where ParentID is null 

Example at SQL Fiddle.

+0

完美。这正是我所期待的。非常感谢快速响应。 – 2013-02-18 17:42:51

0

你为什么不尝试:

HAVING(count(ParentID)) < 2 

在查询结束。适当地使用组。