0

重複の可能性:
SQL Server で再帰的な自己結合を行う最も簡単な方法は?

アイテム/製品のグループで構成されるテーブルを SQL で作成する必要があります。作成された新しいグループはそれぞれ、事前定義されたグループの 1 つまたは以前に形成されたグループの下に作成されます。このすべてのデータを SQL テーブルに保持したいと考えています。これまでのところ、次のようなテーブルを作成しています。

  • グループ ID
  • グループ名
  • Group Under (これは、このグループが属しているグループの ID を格納します。

しかし、これは次のレベルのみを参照できます。このグループのスーパー親が誰であるかを知るにはどうすればよいでしょうか。

例えば:

  • 私はグループを持っていますA, B, C
  • AさらにサブグループがありA1, A2, A3ます。
  • A1にはさらにサブグループがありA11, A12, A13ます。

スーパーペアレント グループに関する情報、つまりまたはAから取得できますか?A11A22A33

問題が明確でない場合はお知らせください..

4

1 に答える 1

1

T-SQL と MSSQLServer (指定しなかった) を想定し、Groupテーブルが次のようになるとします。

Id | Name | ParentId
---+------+---------
 1 | A    | NULL
 2 | B    | NULL
 3 | C    | NULL
 4 | A1   | 1
 5 | A2   | 1
 6 | A3   | 1
 7 | A11  | 4
 8 | A12  | 4
 9 | A13  | 4

次の再帰的 CTE を使用して、特定のグループのトップ レベル (「A12」など) を見つけることができます。

WITH [Group](Id, Name, ParentId) AS
(
    SELECT 1, 'A'  , NULL UNION
    SELECT 2, 'B'  , NULL UNION
    SELECT 3, 'C'  , NULL UNION
    SELECT 4, 'A1' , 1    UNION
    SELECT 5, 'A2' , 1    UNION
    SELECT 6, 'A3' , 1    UNION
    SELECT 7, 'A11', 4    UNION
    SELECT 8, 'A12', 4    UNION
    SELECT 9, 'A13', 4

), q AS 
(
    SELECT  
        *
    FROM    
        [Group]
    WHERE
        [Name] = 'A12' -- Given 'A12' as the child
    UNION ALL
    SELECT  
        g.*
    FROM
        [Group] g
    JOIN    
        q
        ON      
        q.ParentId = g.Id
    )
SELECT  
    *
FROM
    q
WHERE
    ParentId IS NULL

このクエリは次を返します。

Id | Name | ParentId
---+------+---------
 1 | A    | NULL
于 2012-10-30T16:20:50.393 に答える