2015-10-19 55 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