Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 选择物化路径中具有ID的所有行_Sqlite_Select_Materialized Path Pattern - Fatal编程技术网

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

Sqlite 选择物化路径中具有ID的所有行,sqlite,select,materialized-path-pattern,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,如何获取高于(一个查询)或低于(另一个查询)的所有

我有一个带有物化路径列(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,我想在7之外选择ID为1、2和5的行。 如果给定ID为3,请选择1、2和3。等等


谢谢。

首先,您必须决定是否希望在物化路径上使用尾随
,我假设您确实希望使用它们,因为这样会使生活更轻松

类似这样的操作将获得以下节点:

select id
from tree
where matpath like (
    select matpath || id || '.%'
    from tree
    where id = X
)
其中
X
是您感兴趣的节点。您的树如下所示:

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
1--2-+-3--4--6
|
+- 5 --- 7
使用几个值应用上述查询与图表匹配:

X | output
--+--------------
3 | 4, 6
7 |
2 | 3, 4, 5, 6, 7
在客户机中,获取给定节点上方的节点更容易:只需抓取
路径,切掉尾随的
,然后分割剩余的
。SQLite的字符串处理支持相当有限,我想不出一种方法来拆分具体化的路径,而不尝试添加一个用户定义的
split
函数(我不确定是否可以添加适当的
split


所以在数据库外进行两次查询和一点字符串争论可以得到您想要的结果。

好的,我希望有一个
one查询解决所有问题的
解决方案,我没有看到。非常感谢。