Почему мой Oracle иерархический запрос останавливается только после одного уровня - PullRequest
2 голосов
/ 07 февраля 2020

Моя таблица имеет крошку, похожую на файловую систему для отображения навигации по страницам. Например <level1> / <level2> / <level3>. Я хочу начать с любого уровня <level1> и перейти к дочерней <level1> / <level2> крошке. Мне все равно, идет ли речь сначала о ширине или глубине, мне просто нужно следовать иерархии, чтобы я мог записывать родительские дочерние элементы для другой цели.

Мои попытки дают мне только первый уровень и останавливаются.

create table sc_hub_hierarchy_test (breadcrumb varchar2(1000),child_breadcrumb varchar2(1000),crumb_depth);

insert into sc_hub_hierarchy_test (breadcrumb,child_breadcrumb) values('Level1A','Level1A/Level2A',0);
insert into sc_hub_hierarchy_test (breadcrumb,child_breadcrumb) values('Level1B','Level1B/Level2A',0);
insert into sc_hub_hierarchy_test (breadcrumb,child_breadcrumb) values('Level1B','Level1B/Level2B',0);
insert into sc_hub_hierarchy_test (breadcrumb,child_breadcrumb) values('Level1A/Level2A','Level1A/Level2A/Level3A',2);

select breadcrumb
from sc_hub_hierarchy_test
start with crumb_depth=0
connect by breadcrumb=child_breadcrumb;

Также пробовал:

select breadcrumb
from sc_hub_hierarchy_test
start with crumb_depth=0
connect by prior breadcrumb=child_breadcrumb;

Мои результаты были такими, как показано ниже:

Level1A
Level1B
Level1B
Level1A

** Обратите внимание, фактические данные, используемые для упрощения вопроса.

В моих данных имеется более одного root, поэтому, если предложение «начать с» было изменено на предложение «где», будет возвращено несколько строк. Существует более одного уровня.

Я также попытался удалить предложение «начать с» и получил больше результатов. Поведение такое, как будто оно применяет условие в предложении «начать с» к каждому уровню.

Почему Ларри Эллисон решил остановиться после первого шага?

1 Ответ

1 голос
/ 07 февраля 2020

Вам не хватает ключевого слова PRIOR.

Ваш запрос должен выглядеть следующим образом:

SQL> SELECT BREADCRUMB, LEVEL
  2    FROM SC_HUB_HIERARCHY_TEST
  3  START WITH CRUMB_DEPTH = 0
  4  CONNECT BY BREADCRUMB = PRIOR CHILD_BREADCRUMB;

BREADCRUMB           LEVEL
--------------- ----------
Level1A                  1
Level1A/Level2A          2
Level1B                  1
Level1B                  1

SQL>

Cheers !!

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