2014-01-29 98 views
0

我有一個表格將從第三方Web服務中抓取幾百個服務。這些服務有數百萬個符號,我也正在獲取。從下往上遍歷SQL層次結構到達特定級別

層次結構本質上是這樣的;

root 
|_service1 
| |_service1/sub1* 
| |_service1/sub2 
| |_service1/sub3 
| |_service1/sub4 
| | |_service1/sub4/sub1 
| | |_**service1/sub4/sub1/leaf1** 
| | 
| |_service1/sub5 
| 
|_service2 
    |_service2/sub1 
    |_service2/sub2 
    |_service2/sub3 

所以我想要實現的是 - 給定一個ID爲葉,我要工作了樹,直到我找到了分公司是isActive true,則返回值。

在這個例子中,我想找到的葉/service1/sub4/sub1/leaf1在這種情況下是service1/sub1

主動服務到現在我一直在使用一個公用表表達式從頂部向下的工作和設置位於該分支下的葉子上的附加ActiveServiceId列;數百萬的符號變成了一個非常漫長的過程。

我只使用一個非常小的符號子集(雖然我不知道哪些和我需要它們全部),因此在查詢時已知的葉子ID只有幾百個。

我創建了一個SQLFiddle,以反映這一層次結構,以幫助任何人誰也許能幫助

UPDATE進一步解釋目前的做法。如果我決定service1將成爲新的活動服務 - 每個子分支中service1下的葉子需要冒泡到service1,我將重置所有子分支,因此它們都不會被標記爲活動

+1

你有沒有考慮過使用分層數據類型?:http://technet.microsoft.com/en-us/library/bb677173.aspx – Jayvee

+0

我剛剛讀了這個,有用的信息,現在有,但我不'我認爲它會解決這個特殊的問題。 – owen79

回答

1

您可能會發現它有用的使用嵌套組來存儲這些數據:

http://en.wikipedia.org/wiki/Nested_set_model

我已經使用這個方法之前存儲在數據庫樹數據,發現它有利於查詢父等

下屬於所有節點的數據

使用存儲在嵌套集中的數據解決方案您的問題將是如下:

SELECT s.ID 
FROM TreeTable s 
WHERE s.L = (SELECT Max(t.L) 
      FROM TreeTable t, TreeTable LeafNode 
      WHERE t.isActive = true 
       AND t.L < LeafNode.L 
       AND t.R > LeafNode.R 
       AND LeafNode.ID = ?) 
+0

這似乎是有道理的,我只是想弄清楚我將如何爲此創建表並添加數據。我想我理解模型的要點。 – owen79

+0

它看起來像增加節點,我需要增加節點的數量左右推出,是正確的理解?任何更好的方式來一次添加很多嗎? – owen79

+0

是的。通過將要添加到+1的節點的大小(左側)來增加所有更高節點的權利。因此,爲了一個新的葉節點添加到其具有L = 6,R = 7你父: UPDATE treetable中 SET R = R + 2 其中R> = 7 然後 INSERT INTO treetable中(L,R)VALUES(7 ,8) –

0

如果您有存儲爲你可以做以下的每個節點的字符串的完整路徑:

SELECT r.ID 
FROM TreeTable r, TreeTable rs 
WHERE rs.ID = ? 
    AND r.Path = Left(rs.path,Len(r.Path)) 
    AND Len(r.Path) = (SELECT Max(Len(t.Path)) 
        FROM TreeTable t, TreeTable s 
        WHERE s.ID = ? 
         AND t.Path = Left(s.path,Len(t.Path)) 
         AND t.isActive = true) 

確定它不漂亮,我歡迎任何建議爲了使它更整潔 - 但它應該工作。

+0

不,這是例子,可能沒有幫助,畢竟這樣做完全是這樣 – owen79