选择在物化路径中具有ID的所有行

时间:2011-09-04 17:24:18

标签: sqlite select materialized-path-pattern

我有一个树形结构表,带有物化路径列(matpath)。 数据如下所示:

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 个答案:

答案 0 :(得分: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

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

因此,在数据库外部进行两次查询和一些字符串争论可以获得您想要的结果。