有一张 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 = 0
至 match = 0
( anymatch
不再需要计算)将停止只搜索匹配所在的分支。
关于sql - Oracle 通过包含停止条件进行连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41874443/