问题描述
就像当循环发生在顶部节点(根节点直接连接回根节点)时,Oracle 继续遵循循环循环之外的路径,有什么方法可以在循环之间做同样的事情。 就像我有一些像下面这样的数据
create table t1 ( c1 varchar2(2),c2 varchar2(2));
insert into t1 values ('A','B');
insert into t1 values ('B','C');
insert into t1 values ('C','**A**');
并执行以下查询:
select * from (
select distinct
connect_by_root c1 as c3,c1,c2
from t1
connect by nocycle c1 = prior c2
) where c3='A';
它会给我这个结果
c3 c1 c2
A A B
A B C
**A** **C** **A**
它给了我循环的根值。但如果我有如下数据。
create table t2 ( c1 varchar2(2),c2 varchar2(2));
insert into t2 values ('A','B');
insert into t2 values ('B','C');
insert into t2 values ('C','**B**');
select * from (
select distinct
connect_by_root c1 as c3,c2
from t2
connect by nocycle c1 = prior c2
) where c3='A';
这给了我
c3 c1 c2
A A B
A B C
但我也需要第三排,即 A C B。 所以想知道这是否可以做到?
解决方法
您可以使用递归子查询分解子句:
WITH rsqfc ( c3,c1,c2 ) AS (
SELECT c1,c2
FROM t2
WHERE c1 = 'A'
UNION ALL
SELECT r.c3,t.c1,t.c2
FROM t2 t
INNER JOIN rsqfc r
ON ( t.c1 = r.c2 )
)
CYCLE c1,c2 SET is_cycle TO 1 DEFAULT 0
SELECT c3,c2
FROM rsqfc
WHERE is_cycle = 0;
对于您的示例数据:
create table t2 ( c1,c2 ) AS
SELECT 'A','B' FROM DUAL UNION ALL
SELECT 'B','C' FROM DUAL UNION ALL
SELECT 'C','B' FROM DUAL;
输出:
C3 | C1 | C2 :- | :- | :- A | A | B A | B | C A | C | B
dbfiddle here