Сначала вы должны решить, хотите ли вы завершить .
на ваших материализованных путях, я предполагаю, что вы хотите их , потому что это облегчит жизнь.
Примерно так получатся узлы ниже:
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
). .
Таким образом, два запроса и небольшой спор строк вне базы данных дадут вам то, что вы хотите.