用于解决数据库中传递依赖关系的 SQL 查询

Pri*_*shi 5 sql oracle oracle11g

此数据的 SQLFIdle 链接。

假设我有一个具有以下结构的表:

create table rd(r1 number,r2 number, primary key (r1,r2));
Run Code Online (Sandbox Code Playgroud)

样本数据:

| R1 | R2 |
-----------
|  1 |  2 |
|  1 |  4 |
|  2 |  3 |
|  3 |  1 |
|  4 |  5 |
Run Code Online (Sandbox Code Playgroud)

这意味着 R1 与 R2 是双向相关的。因此,如果数据库中有 1,3 的条目,则不会有像 3,1 这样的条目。

根据以上数据:1与2、4、3直接相关。并且 4 也与 1 相关。因此,通过传递依赖,1 和 5 也被认为是相关的。

预期结果:

| R1 | R2 |
-----------
|  1 |  2 |
|  1 |  4 |
|  1 |  3 |
|  1 |  5 |
Run Code Online (Sandbox Code Playgroud)

谁能为此编写 SQL 查询吗?

Nic*_*nov 3

当您运行Oracle 11g(如果它恰好是Release 2)时,作为方法之一,您可以使用递归公用表表达式(也称为递归子查询分解)来获得所需的结果

SQL> with rcte(r1, r2, lv, root) as(
  2    select r1
  3         , r2
  4         , 0 lv
  5         , r1
  6     from rd
  7    where r1 = 1
  8  
  9    union all
 10  
 11    select t.r1
 12         , t.r2
 13         , lv + 1
 14         , q.root
 15      from rd   t
 16      join rcte q
 17        on (t.r1 = q.r2)
 18  )
 19  search depth first by r1 set s
 20  cycle r1 set is_cycle to 'y' default 'n'
 21  
 22  select root
 23       , r2
 24    from rcte
 25  where is_cycle = 'n'
 26    and r2 <> root
 27  ;

      ROOT         R2
---------- ----------
         1          2
         1          3
         1          4
         1          5
Run Code Online (Sandbox Code Playgroud)