2015-12-18 1 views
2

Моя структура таблицыНайти наиболее дочерний узел родителя (любого уровня) в оракула

| Parent ID | ID   | 
|-------------|-------------| 
|  a  |  b  | 
|  b  |  c  | 
|  b  |  d  | 
|  b  |  e  | 
|  c  |  f  | 
|  d  |  g  | 
|  e  |  h  | 

Я хочу, чтобы получить наиболее дочерний узел для всех родителей. В другой таблице у меня есть a, b и c. Затем я хочу получить результат ниже.

| Parent_ID | Child  | 
|-------------|-------------| 
|  a  |  f  | 
|  a  |  g  | 
|  a  |  h  | 
|  b  |  f  | 
|  b  |  g  | 
|  b  |  h  | 
|  c  |  f  | 

f, g, h являются самыми низкими гранулированными.

+0

Вам нужен рекурсивный запрос здесь. –

ответ

4

«Большинство дочерних узлов» Я ожидаю, что вы имеете в виду листовые узлы дерева. Вы можете определить листовые узлы с псевдонимом CONNECT_BY_ISLEAF иерархического (CONNECT BY) запроса.

Учитывая данные выборки в таблице следующий запрос дает желаемые результаты:

select connect_by_root id id 
    , parent_did 
    from table1 
where connect_by_isleaf = 1 
connect by id = prior parent_did 
    start with id in ('a','b','c'); 

| ID | PARENT_DID | 
|----|------------| 
| a |   f | 
| a |   g | 
| a |   h | 
| b |   f | 
| b |   g | 
| b |   h | 
| c |   f | 

SQL Fiddle

Принимая обновленные данные и требования во внимание, включая тот факт, что вторая таблица содержит а, б и с как условия запуска:

select connect_by_root parent_id parent_id 
    , id 
    from table1 
where connect_by_isleaf = 1 
connect by prior id = parent_id 
    start with parent_id in (select id from table2) 

| PARENT_ID | ID | 
|-----------|----| 
|   a | f | 
|   a | g | 
|   a | h | 
|   b | f | 
|   b | g | 
|   b | h | 
|   c | f | 

SQL Fiddle Вы можете узнать мо re о иерархических запросах от documentation.

+0

Спасибо. Но в вопросе Id и Parent Id col был заменен. Я исправил то же самое сейчас. – user2258035

0

сначала вы должны убедиться, что вы используете Oracle 10g видение или выше, а затем использовать CONNECT_BY_ISLEAF, и вы можете попробовать, чтобы узнать больше о connect_by

select connect_by_root a.id as id,a.parent_did 
     from table1 a inner join table2 b on a.id=b.id 
     where connect_by_isleaf = '1' 
     CONNECT BY PRIOR a.parent_did = a.id; 
Смежные вопросы