powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / LTREE - как двигать поддеревья?
9 сообщений из 9, страница 1 из 1
LTREE - как двигать поддеревья?
    #39302306
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как работать с деревьями с использованием ltree?
Может ссылка с приличным примером есть.
Но хотелось бы полноценную работу, т.е
- добавление
- удаление узлов и поддеревьев
- перевешивание поддеревьев
...
Рейтинг: 0 / 0
LTREE - как двигать поддеревья?
    #39302475
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточнение
1. Как добавлять узлы к родителю? надо ли делать значение пути узла уникальным среди братьев, как это делается в SQL Server HierarchyID?
Или он может быть таким же как у братьев?

2. Как сделать переваешивание поддерева к другому паренту, пересчет путей в поддереве?

3. Не могу найти какие-то примеры такой реализации, буду благодарен за ссылки
...
Рейтинг: 0 / 0
LTREE - как двигать поддеревья?
    #39302526
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по первому вопросу можно два способа:

было
1. А.B.C
добавляем D к ветке C

лучше инсертить новую запись (так как может оказаться что изначально у нас была запись ABCE а присваиваем D к С)

1.A.B.C
2.A.B.C.E


по второму вопросу:
перевешивание я бы примерно сделал так:

несколько действий (в рамках одной тарнзакции (функции))
было
1. A.B.C.D
2. A.B.C.E
3. F.G
4. F.S
допустим хотим перевешать поддерево С на F

находим все деревья содержащие поддерево С
1. A.B.C.D
2. A.B.C.E

находим все потомки содержащие в С
С.D
С.E

удаляем эти записи из LTREE (1 и 2я запись)
добавляем родительскую запись без С (если нет в бд веток с таким началом, например уже может быть A.B.H.W)
5. A.B.

и добавляем новые записи
6. F.C.D
7. F.C.E

в итоге получаем:

3. F.G
4. F.S
5. A.B.
6. F.C.D
7. F.C.E
...
Рейтинг: 0 / 0
LTREE - как двигать поддеревья?
    #39302530
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по первому вопросу лучше всего через ||
ltree || ltree - объединяет два пути ltree
...
Рейтинг: 0 / 0
LTREE - как двигать поддеревья?
    #39305720
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ли аналог функции в SQL Server IsDescendantOf?

или как сделать такую выборку при использовании ltree?


зы. Функция определяет является ли данный узел потомком
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE TABLE Employees
(EmployeeLevel hierarchyid NOT NULL,
Position nvarchar(60) NOT NULL,
JobType nvarchar(60) NULL);

INSERT employees
VALUES ('/', 'CEO', 'Executive');

INSERT Employees
VALUES
('/1/', 'CIO', 'IT Executive'),
('/2/', 'CFO', 'Finance Executive'),
('/1/1/', 'Project Manager', 'IT Manager'),
('/1/1/1/', 'Programmer', 'IT Staff'),
('/1/2/1/', 'Systems Engineer', 'IT Staff'),
('/1/2/', 'Infrastructure Manager', 'IT Manager'),
('/3/', 'CMO', 'Marketing Executive'),
('/2/1/', 'Accounts Rec Manager', 'Finance Manager'),
('/2/1/1/', 'Accountant', 'Finance Staff'),
('/2/1/2/', 'Accountant', 'Finance Staff'),
('/2/1/2/1/', 'Accountant Assistant', 'Finance Support Staff'),
('/3/1/', 'Direct Channels Marketing Manager', 'Marketing Manager');
 
select cast(employeelevel as nvarchar(100)) as [Converted Level]from employees




Who are descendants of the CFO?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DECLARE @id as Hierarchyid
SET @id = (SELECT employeelevel from employees where Position = 'CFO')
SELECT * from employees
where employeelevel.IsDescendantOf (@id) =1

DECLARE @id as Hierarchyid
SET @id = (SELECT employeelevel from employees where Position = 'CEO')
SELECT * from employees
where employeelevel.IsDescendantOf (@id) =1
...
Рейтинг: 0 / 0
LTREE - как двигать поддеревья?
    #39305792
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Принципиально с документацией не дружите?..
https://www.postgresql.org/docs/current/static/ltree.html#AEN172117 OperatorReturnsDescriptionltree <@ ltreebooleanis left argument a descendant of right (or equal)?
...
Рейтинг: 0 / 0
LTREE - как двигать поддеревья?
    #39306143
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovРолг Хупин,

Принципиально с документацией не дружите?..
https://www.postgresql.org/docs/current/static/ltree.html#AEN172117 OperatorReturnsDescriptionltree <@ ltreebooleanis left argument a descendant of right (or equal)?

Не дружу, документация - это серьезная вещь, ее надо прорабатывать и изучать

Я кстати, некоторые ответы некоего vyegorov нашел на стековерфлоу
...
Рейтинг: 0 / 0
LTREE - как двигать поддеревья?
    #39306174
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинЯ кстати, некоторые ответы некоего vyegorov нашел на стековерфлоу
Не поверишь — это тоже я :)
...
Рейтинг: 0 / 0
LTREE - как двигать поддеревья?
    #39306188
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovРолг ХупинЯ кстати, некоторые ответы некоего vyegorov нашел на стековерфлоу
Не поверишь — это тоже я :)

У меня было смутное подозрение , но я гнал эту мысль
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / LTREE - как двигать поддеревья?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]