gpt4 book ai didi

sql - Oracle 通过包含停止条件进行连接

转载 作者:行者123 更新时间:2023-12-04 03:15:00 25 4
gpt4 key购买 nike

有一张 table articles包括分层的文章结构。 1组件由 n 组成成分。因此,我们可以浏览文章的结构和用法(上下)。

使用预言机 hierarchical queries这可以在 sql 级别非常有效地完成。

SELECT item
FROM articles
START WITH component = '0815'
CONNECT BY NOCYCLE PRIOR assembly = component;

想象一下有一个文章螺丝。该螺钉用于许多组件以及它们的组件。我们想弄清楚 srew 是否用于由 WHERE 标识的特定组件中。以上几个级别的条款。
SELECT item
FROM articles
WHERE attr1 = 'marker' --any condition
START WITH component = '0815'
CONNECT BY NOCYCLE PRIOR assembly = component;

此语句效果很好,但会评估结果中所有可能的程序集。在我们的例子中,我们只对是否存在 感兴趣。至少一个匹配 的程序集而不是在整个结果中。该语句对所有程序集都需要几分钟,但当它在第一行回答给定问题之后停止时可能会更快。

有没有办法告诉 Oracle 在第一次匹配后中止此查询?

最佳答案

您可以使用递归子查询分解来停止所有搜索,如下所示:

with h(it,art,match,anymatch) as
(select item, assembly
, case when attr1 = 'marker' then 1 else 0 end
, max(case when attr1 = 'marker' then 1 else 0 end) over()
from articles
where component = '0815'
union all
select item, assembly
, case when attr1 = 'marker' then 1 else 0 end
, max(case when attr1 = 'marker' then 1 else 0 end) over()
from h, articles
where art = component
and anymatch = 0)
cycle art set cycle to 1 default 0
select it item
from h
where match = 1
and cycle = 0

它将返回在尽可能小的级别上找到的所有匹配项。

但是由于是广度优先搜索,如果第一个找到 marker 不会快很多。很深。

更改条件 anymatch = 0match = 0 ( anymatch 不再需要计算)将停止只搜索匹配所在的分支。

关于sql - Oracle 通过包含停止条件进行连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41874443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com