首页 > 解决方案 > 连接永无止境

问题描述

我在使用 Oracle START WITH / CONNECT BY 进行递归时遇到了一点麻烦。

给定一个表id_string, id, ordre,precid_string的串联id_ordre。以及具有相同(链接到)prec的两个元素之间的链接。该表包含 500 行,其中 196 个唯一的.id1_1,1,1,21_1,1,2,nullid_string

我想从这个表中检索所有链接的行,以id_stringequals开头id|| '_' || ordre并通过ordreand链接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

我的问题很简单,select 已经运行了一个小时并且还在运行 :'( 我确定我的代码有问题,但我不知道在哪里。

数据文件https://pastebin.com/R66T3hAu

标签: sqloracleconnect-by

解决方案


你错过了一个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(如果有很多样本数据,您可以在将来提供样本数据;或者提供一个更小的样本来显示问题......)


推荐阅读