Вам не хватает 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 (которые вы могли бы предоставить в будущем с образцами данныхесли их так много, или предоставьте гораздо меньший образец, показывающий проблему ...)