#sql #oracle #hierarchical-data #recursive-query #connect-by
#sql #Oracle #иерархия-данные #рекурсивный запрос #подключение по
Вопрос:
У меня есть таблица, подобная приведенной ниже
MyTable
| ID | PARENT_ID |
-----------------------------
| 20 | null |
| 40 | null |
| 50 | null |
| 70 | 122 |
| 100 | 40 |
| 102 | 4 |
| 126 | 100 |
| 9 | 50 |
| 122 | 40 |
| 123 | 9 |
Я хочу выбрать иерархическое дерево, включающее всех дочерних и родительских элементов, как показано ниже, для заданных трех дочерних элементов 126, 70 и 123
Ожидаемый результат
| ID | PARENT_ID |
-----------------------------
| 126 | 100 |
| 100 | 40 |
| 40 | null |
| 70 | 122 |
| 122 | 40 |
| 123 | 9 |
| 9 | 50 |
| 50 | null |
Я пробовал
select ID, PARENT_ID
from MyTable
start with ID=126 //this for example
connect by prior ID=Parent;
Комментарии:
1. Пожалуйста, покажите нам, что вы пытались до сих пор, это помогло бы не только нам помочь вам, изменив ваш запрос, но и лучше объяснить, что вы хотите, потому что это на самом деле не имеет никакого смысла..
Ответ №1:
Вы можете сделать это с помощью иерархического запроса, используя CONNECT BY PRIOR
предложение:
select * from MyTable start with id in (126,70,123)
connect by prior parent_id = id;
ПРИМЕЧАНИЕ: поскольку у вас есть два узла с parent_id = 40
, вы получите две строки с 40 как ID
и null как parent_id
. Если вы хотите оставить только одну строку, используйте distinct
предложение:
select distinct * from MyTable start with id in (126,70,123)
connect by prior parent_id = id;