sql - 连接永无止境
问题描述
我在使用 Oracle START WITH / CONNECT BY 进行递归时遇到了一点麻烦。
给定一个表id_string
, id
, ordre
,prec
是id_string
的串联id_ordre
。以及具有相同(链接到)prec
的两个元素之间的链接。该表包含 500 行,其中 196 个唯一的.id
1_1,1,1,2
1_1,1,2,null
id_string
我想从这个表中检索所有链接的行,以id_string
equals开头id|| '_' || ordre
并通过ordre
and链接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 已经运行了一个小时并且还在运行 :'( 我确定我的代码有问题,但我不知道在哪里。
解决方案
你错过了一个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(如果有很多样本数据,您可以在将来提供样本数据;或者提供一个更小的样本来显示问题......)
推荐阅读
- c# - 如何从 Visual Studio 2019 Mac 上的操作自动创建视图页面
- javascript - 用 require.js 扩展 jquery(多个扩展)?
- sql - SQL 特定的 WHERE 子句
- java - RFID 线程未在后台运行
- ssl - 来自 Qpid JMS 的带有 SSL/TLS 的故障转移连接 URL
- javascript - GoogleScript - 加速一个简单的循环
- python - 带有大型 Pandas 数据框的 Python 内存错误
- c# - 当 ViewModel 在后面的代码中初始化时,ListView 不显示来自 ViewModel 的数据
- database - 贪心算法总是最适合为数据库表选择适当的索引吗?
- java - 在 Maven 中将本地 Jar 添加到父模块