|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
/* Работаю с Hana, но хотелось бы решения на стандартном SQL, поэтому обращаюсь к форуму Oracle. */ Дано: Есть (сохранена в таблице tab_hyer) уже построенная иерархия с колонками rank, tree_size, parent_id, node_id, delete_flag где rank - номер текущей ноды (данное дерево упорядочено по rank от 1 до некоего максимального значения) tree_size - размер под-дерева, исходящего из этого узла, то есть число всех дочерних нод первого порядка, их ноды, ноды этих нод и так далее до листьев. То есть если взять строку с rank = 4 и в ней будет стоять tree_size = 234, строки с ранками между 4+1 .... 4+234 будут всеми дочерними нодами всех порядов строки с rank = 4. delete_flag - выставленный сторонним алгоритмом флаг, который говорит, что некоторые ноды дерева на самом деле ошибочные и должны быть удалены (такие ноды помечены delete_flag = true, остальные помечены false) Для простоты предположить, что в иерархии одно дерево с одним корнем (rank = 1). В дереве соотношение одни ко многим, то есть из parent может выходить несколько node, но у каждой node строго один parent. Задача: написать update поля delete_flag таблицы tab_hyer, который для всех дочек всех строк с delete_flag = true проставит delete_flag = true, то есть: если сторонний алгоритм пометил ноду как ошибочную, нужно пометить и всё исходящее из нее под-дерево на удаление. Можно, но не хотелось бы, вместо update текущей таблицы создать новую таблицу с результатом апдейта. Ограничения: Можно использовать джойны, оконные функции, нельзя использовать pl/sql, циклы и встроенные функции работы с иерархиями типа "верну все ранки всех нод, исходящих из данной ноды, только скажи мне ее ранк". Опционно: вместо решения сообщить мне куда пройти, что решение, даже если оно существует, будет нечитабельно и неподдерживаемо в силу своей интеллектуальной изощренности и посоветовать отказаться от ограничений. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2021, 22:05 |
|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
lav314 на стандартном SQL нельзя использовать … встроенные функции работы с иерархиями типа "верну все ранки всех нод, исходящих из данной ноды, только скажи мне ее ранк" куда пройти ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2021, 08:16 |
|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
lav314 То есть если взять строку с rank = 4 и в ней будет стоять tree_size = 234, строки с ранками между 4+1 .... 4+234 будут всеми дочерними нодами всех порядов строки с rank = 4. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
SY. P.S. LATERAL можно заменить на CROSS APPLY. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2021, 15:29 |
|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
SY Код: plsql 1.
lav314 нельзя использовать … встроенные функции работы с иерархиями типа "верну все ранки всех нод, исходящих из данной ноды, только скажи мне ее ранк" ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2021, 15:49 |
|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2021, 16:54 |
|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
Elic SY Код: plsql 1.
lav314 нельзя использовать … встроенные функции работы с иерархиями типа "верну все ранки всех нод, исходящих из данной ноды, только скажи мне ее ранк" Ну мультипликатор строк это не типа "верну все ранки всех нод, исходящих из данной ноды, только скажи мне ее ранк" и есть куча других мультипликаторов. Например: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
А можно и без мультипликатора строк: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2021, 16:55 |
|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
SY А можно и без мультипликатора строк: ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2021, 17:11 |
|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
а parent_id разве не надо в иерархии учитывать? казалось бы задача отметить потомков только нужных узлов. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2021, 08:23 |
|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
serpv а parent_id разве не надо в иерархии учитывать? казалось бы задача отметить потомков только нужных узлов. Иерархия уже построена - все строки специально занумерованы (те самые ранки). Отменить нужно не только ближайших потомков нужных узлов (в ближайшем потомке мы храним parent и ваша идея сработает), а вообще всех потомков этого узла, в моем случае может быть до десяти уровней глубины. А мы ведь храним только ближайшего parent в строке и не знаем, какой parent был на три (для примера) уровня выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2021, 16:25 |
|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
Благодарю SY за решения через drivers и Elic за решение через exist (выглядит очень изящно!). Буду разбираться с этими решениями. Надеюсь, они учитывают, что интервалы удаляемых нод могут быть включены один в другой и т.д., то есть сторонний алгоритм мог пометить ноду 345 и ноду 367 на удаление, но при этом 367-я - дочка N-того уровня 345-й, то есть она и все ее дочки будут и так удалены при удалении потомков 345-й. Я не против, если поддерево 367-й будет помечено на удаление два раза :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2021, 16:31 |
|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
lav314 Я не против, если поддерево 367-й будет помечено на удаление два раза Elic Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2021, 16:55 |
|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
Так как я ничего не понимаю в SQL, прошу Elic рассмотреть следующую задачу 1) Есть изначальная таблица tab_hyer, заполненная простейшей иерархией ( 1<-- 2 <-- 3 <-- 4 ) Код: plsql 1. 2. 3. 4. 5. 6. 7.
2) Есть сторонний процесс, который пометил на удаление корневую и два нижележащих узла Код: plsql 1. 2. 3. 4. 5. 6. 7.
Таким образом теперь нода rank = 4 входит в три вложенных в друг друга поддерева, которые должны быть удалены. 3) Есть написанный Elic скрипт удаления дочерних нод всех уровней для удаленных ранее сторонним процессом узлов: Код: plsql 1. 2. 3. 4.
4) Доказать (желательно средствами, доступными ничего не понимающему в sql человеку), что при исполнении скрипта из пункта 3 строка с rank = 4 будет проверена на условие Код: plsql 1.
одни раз, а не три раза как предполагаю я. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 09:45 |
|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
lav314 В дереве соотношение одни ко многим, то есть из parent может выходить несколько node, но у каждой node строго один parent. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 10:58 |
|
Работа с иерархиями: удалить из иерархии всех дочек удаленной на предыдущем шаге ноды.
|
|||
---|---|---|---|
#18+
Elic lav314 на стандартном SQL нельзя использовать … встроенные функции работы с иерархиями типа "верну все ранки всех нод, исходящих из данной ноды, только скажи мне ее ранк" куда пройти Вот тоже хотел спросить, так как в HANA есть отличные от Oracle средства работы с иерархиями. Кстати, пример топикстартер, таблица и столбцы очень похожи на те, что даются в документации HANA . Что то мне кажется, что топикстартер - ленивый троль. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2021, 13:16 |
|
|
start [/forum/topic.php?fid=52&msg=40099970&tid=1879874]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
175ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 284ms |
0 / 0 |