0

階層データを含むテーブルがあります。

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 を使用していることに注意してください。

4

2 に答える 2

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

SQLフィドルでの例。

于 2013-02-18T17:39:23.737 に答える
0

試してみませんか:

HAVING(count(ParentID)) < 2

クエリの最後に。group by を適切に使用します。

于 2013-02-18T17:44:24.747 に答える