|
|
|
вытащить из иерархии по условию
|
|||
|---|---|---|---|
|
#18+
Добрый день. Всегда было туго с пониманием иерархических запросов. Дано: Таблица связи IDPARENT_IDCODE Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Задача: Вернуть ID того родителя, у которого code в заранее определенном списке, в данном случае PD. Это значение может быть как у самого верхнего, так и прямо у ID = 60. В случае отсутствия такого значения возвращать ID самого верхнего. Если такого ID(60) не найдется в выборке, то возвращать сам ID. Сейчас пока это оформлено как курсор в pl/sql функции(дадим ей имя get_parent), последовательно проверяю на условие и возвращаю результат. Когда это единичная операция, то ничего страшного, но сейчас этот ID стало необходимо выгружать доп. столбцом в достаточно большой таблице, и стало тяжело. Упрощенно так(t и t3 - тоже соединения нескольких таблиц, общего у них нет): Код: plsql 1. 2. 3. 4. 5. 6. Подскажите, пожалуйста, как уменьшить нагрузку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 09:44 |
|
||
|
вытащить из иерархии по условию
|
|||
|---|---|---|---|
|
#18+
Версия 12.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 09:45 |
|
||
|
вытащить из иерархии по условию
|
|||
|---|---|---|---|
|
#18+
Забыл дописать, что в случае с исходным id = 60 должно вернуться значение 40 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 09:47 |
|
||
|
вытащить из иерархии по условию
|
|||
|---|---|---|---|
|
#18+
Добавить столбец с нумерацией строк RN, завернуть в подзапрос, добавить фильтр по CODE='PD' и RN=1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 10:36 |
|
||
|
вытащить из иерархии по условию
|
|||
|---|---|---|---|
|
#18+
Alibek B.Добавить столбец с нумерацией строк RN, завернуть в подзапрос, добавить фильтр по CODE='PD' и RN=1. Мимо. Да и по сути гениального предложения: CONNECT_BY_ISLEAF? Не, не слышал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 10:56 |
|
||
|
вытащить из иерархии по условию
|
|||
|---|---|---|---|
|
#18+
Налажал в условии, глобально: Идем по дереву вверх до тех пор, пока не доберемся до вершины, либо пока не найдем узел, кода которого нет в списке, тогда возвращаем его ID, то есть в данном случае у нас P в списке, а PD не в списке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 14:28 |
|
||
|
вытащить из иерархии по условию
|
|||
|---|---|---|---|
|
#18+
Спасибо, кажется, разобрался Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 14:44 |
|
||
|
вытащить из иерархии по условию
|
|||
|---|---|---|---|
|
#18+
kaldoreyСпасибо, кажется, разобрался Код: plsql 1. Помнится, что требовалась остановка по первому встреченному узлу "не в списке"? А почему в connect by нет соответствующего условия? Кроме того, если речь шла не о единственной записи - то, видимо, предполагается отказ от start with. ...собственно, по исходной постановке ради смеха накидал решение на recursive subquery factoring - по мне так проще по полной таблице гонять, чем через ограничения connect by прорываться. Жаль, что постановка поменялась :) ...если таблица ссылок значительного объема - я бы рассмотрел вариант материализации результатов рекурсивного расчета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 14:57 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39487190&tid=1885617]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
425ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 732ms |

| 0 / 0 |
