ПОДКЛЮЧИТЕ никогда - PullRequest
       16

ПОДКЛЮЧИТЕ никогда

0 голосов
/ 31 января 2019

У меня есть небольшая проблема с рекурсией с использованием Oracle START WITH / CONNECT BY.

Учитывая таблицу id_string, id, ordre, prec с id_stringконкатенация id_ordreprec связь между двумя элементами, имеющими одинаковый id (1_1,1,1,2 связан с 1_1,1,2,null).Таблица содержит 500 строк с 196 уникальными id_string.

Я хочу получить все связанные строки из этой таблицы, начиная с id_string, равного id|| '_' || ordre и связанного через ordre и prec,Я использую следующий запрос

SELECT tda.*
FROM T_DRU_ALL tda
START WITH tda.ID|| '_' || tda.ORDRE = tda.id_string
CONNECT BY NOCYCLE PRIOR tda.ORDRE = tda.PREC and tda.id_string = tda.id_string
order by 1,2,3

Моя проблема очень проста, выбор выполнялся в течение одного часа и все еще выполняется: '(Я уверен, что в моем коде что-то не так, но я не делаю't знаю где.

файл данных https://pastebin.com/R66T3hAu

1 Ответ

0 голосов
/ 31 января 2019

Вам не хватает PRIOR, откуда, вероятно, исходили ваши циклы и почему вы добавили NOCYCLE;без него tda.id_string = tda.id_string всегда верно.

Итак, на первый взгляд вы можете просто изменить:

CONNECT BY NOCYCLE PRIOR tda.ORDRE = tda.PREC and PRIOR tda.id_string = tda.id_string

или удалить NOCYCLE:

CONNECT BY PRIOR tda.ORDRE = tda.PREC and PRIOR tda.id_string = tda.id_string

Но это еще никогда не кончается;Любопытно, что просто перестановка терминов в соответствии с тем же логическим результатом работает (но мне все равно лучше сканировать):

или переставить термины (что лучше для меня, но не должно иметь никакогопрактический эффект - не уверен, почему я думал, что видел один раньше!):

CONNECT BY tda.id_string = PRIOR tda.id_string AND tda.PREC = PRIOR tda.ORDRE

, который теперь работает нормально:

ID_STRING         ID      ORDRE       PREC
--------- ---------- ---------- ----------
7682_2          7682          2
7682_2          7682         13          2
7682_2          7682         14         13
7690_6          7690          6
7690_7          7690          7
7693_2          7693          2
7693_2          7693          9          2
7693_2          7693         10          9
...

371 rows selected.

Лично я бы, вероятно, сделал начальное условие

START WITH tda.PREC IS NULL

вместо объединения значений - в любом случае это тот же результат с данными, которые у вас есть.

db <> fiddle (которые вы могли бы предоставить в будущем с образцами данныхесли их так много, или предоставьте гораздо меньший образец, показывающий проблему ...)

...