如何在SQL中获取一组子项列表中的一组唯一父项

时间:2013-02-18 17:34:37

标签: sql sql-server common-table-expression

我有一个包含层次数据的表格:

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。

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

为什么不尝试:

HAVING(count(ParentID)) < 2

在您的查询结束时。适当地使用小组。