Выберите все строки с идентификатором в материализованном пути - PullRequest
0 голосов
/ 04 сентября 2011

У меня есть древовидная таблица с материализованным столбцом пути (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

и т. Д.

С учетом идентификатора, как я могу получить все элементы выше (один запрос) или ниже (другой запрос))?Например, если идентификатор равен 7, я хочу выбрать строки с идентификаторами 1, 2 и 5 в дополнение к 7. Если данный идентификатор равен 3, выберите 1, 2 и 3. И т. Д.

Спасибо.

1 Ответ

1 голос
/ 05 сентября 2011

Сначала вы должны решить, хотите ли вы завершить . на ваших материализованных путях, я предполагаю, что вы хотите их , потому что это облегчит жизнь.

Примерно так получатся узлы ниже:

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). .

Таким образом, два запроса и небольшой спор строк вне базы данных дадут вам то, что вы хотите.

...