2012-10-30 34 views
0

可能重複:
Simplest way to do a recursive self-join in SQL Server?表遞歸hierarchial數據在SQL

我在SQL將包括項目/產品組創建一個表。每個新組都將在預定義的組或之前形成的組之一下進行。我想將所有這些數據保存在SQL表中。到目前爲止,我雖然創建這樣一個表:

  • 組ID
  • 集團名稱
  • 組下(這將存儲在此組是
組的ID

但這隻能引用只是一個新的水平,我怎麼會去了解誰是這個羣體的超親

例如:

  • 我有團體A, B, C
  • A還有其他小組A1, A2, A3
  • A1有其他小組,A11, A12, A13

我我將有大約超級父組即AA11A22A33的信息?

讓我知道,如果這個問題不明確..

+0

我不需要加入。我想知道哪個組織是特定團隊的頂級團隊。 –

+1

*** SQL ***只是*結構化查詢語言* - 許多數據庫系統使用的語言,但不是數據庫產品......很多東西都是特定於供應商的 - 所以我們真的需要知道什麼**數據庫系統**(和哪個版本),你正在使用.... –

+3

@SamarthAgarwal:你**做**需要加入。你需要遞歸地加入Group表到自己,攀登組的層次結構,直到'GroupUnder'爲'NULL'。當它是NULL時,你知道該行中的GroupID是頂級組。我鏈接到的職位就是這樣做的。這不是一個小問題要解決。該解決方案可能看起來令人畏懼,但實際上它非常優雅。 –

回答

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 
+0

您能否請您解釋一下這些陳述,以便我可以在_SQLDATAADAPTER_查詢中調整它們?我無法理解一些事情。 –

+0

明白了。謝謝。 –