2012-11-26 42 views
1

我有一個組表,並且在該表內有一個ParentId列,表示組表中的組父表。目的是從這些組中構建一個動態菜單。我知道我可以循環抓取最後一個孩子並構建一個結果集,但是我很好奇是否有更多的SQL-y方法來完成這個任務。有沒有更好的方法從表格中獲得組的最後一級?

該表具有int,int和varchar的Id,ParentId和Title字段。

基本上,一個層次是可以構建這樣(的人是基地組):

People -> Male -> Boy 
       -> Man 
     -> Female 

我想抓住每一個分支的最後一個子(仁)。所以,在這種情況下{男,男,女}。

正如我所提到的,得到該信息不是問題。我只是在尋找一種更好的方式來獲得它,而不必編寫大量的聯合和循環,我可以基本上更改基本組,並動態地向外遍歷整個層次結構。我不是一個真正的Db傢伙,所以我不知道是否有這樣做的光滑方式。

回答

4

爲了讓葉級爲許多層次的一個,你可以使用一個Recursive Common Table Expressions(熱膨脹係數)來枚舉層次結構,然後檢查其成員不是另一組的父母以過濾去葉:

Declare @RootID int = 1 

;with cte as (
    select 
    Id, 
    ParentId, 
    Title 
    From 
    Groups 
    Where 
    Id = @RootID 
    Union All 
    Select 
    g.Id, 
    g.ParentId, 
    g.Title 
    From 
    cte c 
     Inner Join 
    Groups g 
     On c.Id = g.ParentID 
) 
Select 
    * 
From 
    cte g 
Where 
    Not Exists (
    Select 
     'x' 
    From 
     Groups g2 
    Where 
     g2.ParentID = g.Id 
); 

你也可以做到這一點與左連接,而不是不存在

http://sqlfiddle.com/#!6/8f1aa/9

+0

感謝您的回答。一個問題:儘管如何我只能得到這些人的結果?這將給我所有層次的最後一層。 – Yatrix

+0

@Yatrix更新操作。 – Laurence

1

由於您使用的是SQL Server 2012中,你可以利用hierarchyid;這裏是繼勞倫斯的模式爲例:

CREATE TABLE Groups 
    (
     Id INT NOT NULL 
      PRIMARY KEY 
    , Title VARCHAR(20) 
    , HID HIERARCHYID 
    ) 

INSERT INTO Groups 
VALUES (1, 'People', '/'), 
     (2, 'Male', '/1/'), 
     (3, 'Female', '/2/'), 
     (4, 'Boy', '/1/1/'), 
     (5, 'Man', '/1/2/'); 

SELECT Id 
     , Title 
FROM Groups 
WHERE HID NOT IN (SELECT HID.GetAncestor(1) 
        FROM Groups 
        WHERE HID.GetAncestor(1) IS NOT NULL) 

http://sqlfiddle.com/#!6/00330/1/0

結果:

ID TITLE 
3 Female 
4 Boy 
5 Man 
+0

我不想改變表格。還是)感謝你的建議。必須牢記這一點。 – Yatrix

相關問題