2011-09-04 40 views
0

我有这个带有物化路径列(matpath)的树结构表。 的数据是这样的:选择在物化路径中具有ID的所有行

ID MATPATH PARENT 
--------------------- 
1  NULL  NULL 
2  1.   1 
3  1.2.  2 
4  1.2.3.  3 
5  1.2.  2 
6  1.2.3.4. 4 
7  1.2.5.  5 

鉴于ID,我怎么可以得到高于(一个查询)或低于(花药查询)的所有元素? 例如,如果ID是7,我想选择ID为1,2和5的行除了7. 如果给定的ID是3,请选择1,2和3.等等。

谢谢。

回答

1

首先,您必须决定是否要在物化路径上追踪.,我假设您确实希望它们,因为它会使生活更轻松。

像这样的事情会得到你下面的节点:

select id 
from tree 
where matpath like (
    select matpath || id || '.%' 
    from tree 
    where id = X 
) 

哪里X是你感兴趣的节点您的树是这个样子:

1 --- 2 -+- 3 --- 4 --- 6 
     | 
     +- 5 --- 7 

和应用上面的查询有几个值与图相匹配:

X | output 
--+-------------- 
3 | 4, 6 
7 | 
2 | 3, 4, 5, 6, 7 

获取节点ab在给定节点更容易在客户端:只需抓住matpath,砍掉尾随.,然后拆分.上留下的内容。 SQLite的字符串处理支持是相当有限的,我想不出一种方法来分割物化路径,而不尝试添加用户定义的split函数(我不确定是否可以添加适当的split)。

因此,两个查询和一小串字符串在数据库外面争吵会得到你想要的。

+0

好的,希望有一个我没有看到的“单一查询解决方案”解决方案。谢谢。 – Francisc

相关问题