Sql 循环层次关系查询Oracle

Sql 循环层次关系查询Oracle,sql,oracle,Sql,Oracle,我想要一个查询,它将在传递绑定变量时从表中给出以下输出。数据库是Oracle 11g R2 WITH X AS (SELECT 'A1'col1, 'B1' col2 FROM dual UNION SELECT 'A1'col1, 'B2' col2 FROM dual UNION SELECT 'A2'col1, 'B2' col2 FROM dual UNION SELECT 'A2'col1, 'B3' col2 FROM dual UNION

我想要一个查询,它将在传递绑定变量时从表中给出以下输出。数据库是Oracle 11g R2

 WITH X AS (SELECT 'A1'col1, 'B1' col2 FROM dual UNION 
      SELECT 'A1'col1, 'B2' col2 FROM dual UNION 
      SELECT 'A2'col1, 'B2' col2 FROM dual UNION
      SELECT 'A2'col1, 'B3' col2 FROM dual UNION 
      SELECT 'A3'col1, 'B3' col2 FROM dual UNION 
      SELECT 'A3'col1, 'B4' col2 FROM dual UNION 
      SELECT 'A2'col1, 'B4' col2 FROM dual UNION 
      SELECT 'A4'col1, 'B1' col2 FROM dual UNION 
      SELECT 'A5'col1, 'B6' col2 FROM dual UNION 
      SELECT 'A6'col1, 'B4' col2 FROM dual UNION
      SELECT 'A7'col1, 'B8' col2 FROM dual )
对于col1的Ex-bind变量:p1=A2

输出将包含除“A5--B6”和“A7--B8”两行之外的所有行 换句话说,在bind变量中传递A2时,我需要所有涉及两列的循环关系。 预期产出:

Col1  Col2
-----  ----
A1     B1
A1     B2
A2     B2
A2     B3
A2     B4
A3     B3
A3     B4
A4     B1
A6     B4

您需要所有连接的行。因此,编写一个递归查询。从A2开始,然后查找相关行

with cte(col1, col2) as
(
  select col1, col2 from x
  where 'A2' in (col1, col2)
  union all
  select x.col1, x.col2 
  from x
  join cte on x.col1 in (cte.col1, cte.col2)
           or x.col2 in (cte.col1, cte.col2)
)
cycle col1, col2 set is_cycle to 1 default 0
select distinct col1, col2
from cte
order by col1, col2;

Rextester演示:

您需要所有连接的行。因此,编写一个递归查询。从A2开始,然后查找相关行

with cte(col1, col2) as
(
  select col1, col2 from x
  where 'A2' in (col1, col2)
  union all
  select x.col1, x.col2 
  from x
  join cte on x.col1 in (cte.col1, cte.col2)
           or x.col2 in (cte.col1, cte.col2)
)
cycle col1, col2 set is_cycle to 1 default 0
select distinct col1, col2
from cte
order by col1, col2;

Rextester演示:

你能给出一个示例输出吗?@shrek sure。。我会的,我似乎完全听不懂这个问题。你能给出一个输出示例吗?@shrek,当然。。我会的,我似乎根本听不懂这个问题。太棒了!!哇,你真是天才。我从来没有想到过cycle is cycle子句。我肯定会深入研究这一未经探索的章节。cycle子句实际上只防止递归进入循环时出现异常。我明白了,我也必须重新访问递归查询。我相信Model子句也可以做类似的事情,对吗?但是非常感谢你,先生!惊人的哇,你真是天才。我从来没有想到过cycle is cycle子句。我肯定会深入研究这一未经探索的章节。cycle子句实际上只防止递归进入循环时出现异常。我明白了,我也必须重新访问递归查询。我相信Model子句也可以做类似的事情,对吗?但是非常感谢你,先生!