как выбрать всех дочерних и родительских элементов узла в sql / oracle

#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;