2009-08-26 64 views
2

我有一個基本的實體樹形結構。樹最多可以有5個節點,但可能有N個節點。我制訂什麼如下所示類似表這種關係:分層SQL問題

myID | myDescription | myParentID 

我開始了與已知的物體,這可能轉化爲具有點燃「身份識別碼」。現在我想要獲得所有的子節點。有沒有一種方法可以在一個語句中獲得所有子節點?這需要包括我的孩子的孩子,然後繼續往下走。我正在使用Oracle SQL。

感謝, 周杰倫

回答

4
SELECT * 
FROM mytable 
START WITH 
     myid = :id 
CONNECT BY 
     myparentid = PRIOR myid 
+0

這隻適用於Oracle,對嗎? – 2009-08-26 17:33:27

+0

@Eric:正確,CONNECT BY是Oracle僅有的分層查詢語法。 – 2009-08-26 17:35:26

+0

'@Eric J.':絕對。在'SQL Server'和'PostgreSQL 8.4'中,您使用'CTE','PostgreSQL 8.3-'和'MySQL'在我的博客中閱讀這些文章:http://explainextended.com/2009/05/29/hierarchical -queries-in-postgresql /,http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/ – Quassnoi 2009-08-26 17:36:04

0

我會建議使用另一種方式來您的層次結構模型,如果你想要檢索的所有節點在一個單一的查詢。 nested set模型是一個非常好的和常見的實現。本文概述了這是如何在MySQL中實現的,但它可以輕鬆移植到Oracle。

+0

它是一個很酷的模型,但並不建議用於併發更新大量的數據。添加葉可以更新表中的所有記錄。 **如果數據很少改變,那麼這是一個很好的建議。** – Christian13467 2009-08-26 22:02:58

0

實現這一點的一種可行的方法是添加另一個包含記錄「路徑」的字段。假設最高紀錄是ID = 1。它有一個ID = 5的孩子,並且它又有一個ID = 20的孩子,那麼最後一條記錄會有路徑 /1/5/20 所以如果你想要你的頂級節點的所有子節點,你可以做

select * from MyTable where Path like '/1/%' 

(對不起,SQL Server的語法,我不是一個Oracle開發人員 - 但這個概念仍然適用)

要獲得中間節點

select * from MyTable where Path like '/1/5/%' 

整潔件事兒該解決方案是,您可以將索引應用於「路徑」字段,所以該語句將僅使用一個索引掃描來執行,從而使其非常高效。