Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / LTREE - как двигать поддеревья? / 9 сообщений из 9, страница 1 из 1
01.09.2016, 20:29
    #39302306
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LTREE - как двигать поддеревья?
Как работать с деревьями с использованием ltree?
Может ссылка с приличным примером есть.
Но хотелось бы полноценную работу, т.е
- добавление
- удаление узлов и поддеревьев
- перевешивание поддеревьев
...
Рейтинг: 0 / 0
02.09.2016, 09:33
    #39302475
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LTREE - как двигать поддеревья?
Уточнение
1. Как добавлять узлы к родителю? надо ли делать значение пути узла уникальным среди братьев, как это делается в SQL Server HierarchyID?
Или он может быть таким же как у братьев?

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

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

было
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
02.09.2016, 10:56
    #39302530
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LTREE - как двигать поддеревья?
по первому вопросу лучше всего через ||
ltree || ltree - объединяет два пути ltree
...
Рейтинг: 0 / 0
08.09.2016, 11:38
    #39305720
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LTREE - как двигать поддеревья?
Есть ли аналог функции в 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
08.09.2016, 12:43
    #39305792
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LTREE - как двигать поддеревья?
Ролг Хупин,

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

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

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

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

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


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