2015-10-19 41 views
0

我使用的SQLite在Android和需要作出選擇,以獲得與他們的孩子的所有父母,例如:樹中選擇sqlite的

id || parent_id || child_id || name 

1  1   1   jhon 
2  1   2   helen 
3  2   3   barack 
4  1   4   manuel 
5  3   5   gaga 

的結果應該是:

jhon 
helen 
manuel 
barack 
gaga 

所以,我需要一個請求的SQL,但谷歌搜索了一下,我發現CTE是not支持sqlite,無論如何,我甚至可以使用遞歸java方法返回一個列表選擇名稱順序父asc

注意樹的深度可以超過2級!

回答

0

我不知道如何解釋你的表。每個節點都有一個ID,正確的;和一個(唯一的)parent_id(指向它自己的根節點?)。什麼是child_id?不能有多個孩子嗎?

當處理任意深度的遞歸結構時,如果樹沒有經常更改,並且查詢需要很快,則創建一個支持表(比如說「ancestral_closure」),詳細說明所有父子關係的關閉:

ancestor_id, child_id 

,並確保它只要基表的變化(通過遞歸基表,並添加一排,坐在下面的一個又一個的每個節點)進行更新。當您需要查找節點的所有父母和/或孩子時,加入ancestral_closure表。我不認爲sqlite支持插入/刪除/更新觸發器上執行的存儲過程,所以更新將不得不手動觸發。

SQL擅長簡單的關係,而不是任意圖。

+0

'id'是prymary鍵自動增量,但'parent_id'和'child_id'不是唯一的。這是一個非方向圖1 - > 1,2,4 || 2-> 3 || 3-> 5 – johny