Я работаю с классическим деревом вложенных множеств lft / rgt в SQLite, как описано Джо Селко в его книге «Деревья и иерархии в SQL для умных людей». Мои клиенты спрашивают, как отсортировать один уровень дерева, или изменить порядок дочерних элементов одного из родителей. В книге Джо он говорит о «перемещении поддерева» в разделе 4.8.1. Это в значительной степени то, что я хочу сделать, но навалом.
Мой мыслительный процесс заключается в следующем:
- создать временную таблицу для хранения всех потомков родителя
- скопировать потомков в временную таблицу в новом порядке (дочерние элементы меняют порядок, но их дочерние элементы остаются в том же порядке, в котором они были)
- Как только все дочерние элементы и потомки скопированы в временную таблицу, удалите их из источника и скопируйте их из временной таблицы в источник.
Хотя это не тривиально, я думаю, что это будет работать. Единственная другая незначительная проблема заключается в том, что я работаю в SQLite, где у меня нет сохраненных процедур. Я не против сделать это в три или четыре шага, и я пытаюсь понять, есть ли способ загрузить временную таблицу одной командой вставки. Для начала я собираюсь предлагать сортировку только по «имени». В книге Джо он предлагает создать представление, чтобы показать подчиненных. У меня есть такое представление, что этот запрос даст мне детей родителя в следующем порядке:
select ChildOID, ChildName, lft, rgt
from NodeSubordinates
where ParentOID = '98f13b01-3936-44b0-84a4-56681320fb7d' and
ChildOID <> '98f13b01-3936-44b0-84a4-56681320fb7d'
order by ChildName
Вопрос: как я могу использовать это для управления загрузкой временной таблицы с результатами? Мне также нужно отрегулировать значения lft / rgt, но это достаточно просто. Реальный вопрос заключается в получении ВСЕХ дочерних узлов ParentOID во временной таблице.