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

标签 sql oracle connect-by

有一张 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/

相关文章:

sql - Oracle SQL - 在字段中查找特殊非数字字符

sql - 为什么确定性函数在 CONNECT BY LEVEL 查询中返回意外数字?

sql - 甲骨文 : Hierarchical Query Connect By

sql - SQL 数据库 VB.net 中的语音识别

sql - 处理匿名用户和注册用户的正确方法

mysql - 聚合数据并 JOIN 两个没有对应键的表

oracle - 德尔福TDBX事务 'Invalid transaction Object'

sql - 如何识别硬编码的数据库名称 - SQL Server 2008 r2

oracle - 如何更改 oracle jdbc 客户端的默认 nls_date_format

sql - 在 Oracle 中快速生成连接字符串的方法