как игнорировать непосредственного родителя, который имеет тип c в иерархическом запросе - PullRequest
0 голосов
/ 13 марта 2020

У меня есть определение таблиц ниже. Поскольку мне нужно игнорировать непосредственного родителя, который имеет тип 'Package', в таблицах также могут существовать другие типы.

Например, когда я передаю CHILD_NODE_ID = 3289374 в запросом, непосредственный parent_id - 3289375, но он относится к типу «Папка», поэтому игнорируется его в самом иерархическом запросе, а следующий родительский идентификатор 3289376, имеющий тип «Пакет», также должен игнорироваться в наборе результатов в соответствии с моим требованием.

Меня интересуют только типы пакетов. Мой запрос также будет извлекать только типы пакетов, но при этом не игнорируется непосредственный родительский тип типа "Пакет".

Иерархический запрос должен рекурсивно проверять только типы пакетов и производить окончательный результат как «3289373».

CHILD_NODE          
******************          
ID  PARENT_NODE_ID  CHILD_NODE_ID       ISBN
2314861 3289375     3289374             9780838474648
2314862 3289376     3289375             folder_name
2314863 3289373     3289376             9780838473559
2314864 1271271     3289373             9780838441473



NODE        
***********     
ID      Type    
3289374 Package 
3289375 Folder  
3289376 Package 
3289373 Package 


SELECT *

                    FROM CHILD_NODE c, NODE n 
                         WHERE
                          c.CHILD_NODE_ID=N.ID AND
                           N.TYPE='Package'
                                    START WITH CHILD_NODE_ID=3289374
                                    CONNECT BY PRIOR PARENT_NODE_ID = CHILD_NODE_ID

1 Ответ

0 голосов
/ 15 марта 2020

Вы не можете исключить тип «Папка» при построении иерархии. Это завершает иерархию, так как не было бы предыдущего идентификатора. Таким образом, один из подходов состоит в том, чтобы построить иерархию в CTE, а затем исключить папку в выборе из CTE.

with hier as 
   ( select c.id, c.parent_node_id, c.child_node_id, n.type, level                                          
       from child_node c                       
       join node       n  on c.child_node_id=n.id                                             
      start with c.child_node_id=3289374               
    connect by prior c.parent_node_id = c.child_node_id
   )
select * from hier where type <> 'Folder'; 

Однако будьте осторожны при удалении уровней из иерархии, если вы планируете использовать ее дальше. Я добавил уровень, чтобы показать это. Обратите внимание, что нет уровня 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...