Oracle SQL 嵌套关系进入上级

Oracle SQL nested relationship into on level

如果我有以下table:

ColumnA ColumnB
A        B
C        D
D        E
B        C

如何编写 sql 以获得以下内容:

ColumnC  ColumnD
A        B
A        C
A        D
A        E
B        C
B        D
B        E
C        D
C        E
D        E

嵌套关系的层次很多。 sql 可以处理吗?或者需要 PLSQL?

递归 CTE 可能会有所帮助。

SQL> with
  2  test (cola, colb) as
  3    -- sample data; you already have that
  4    (select 'a', 'b' from dual union all
  5     select 'c', 'd' from dual union all
  6     select 'd', 'e' from dual union all
  7     select 'b', 'c' from dual
  8    ),
  9  -- recursive CTE
 10  temp (parent, child) as
 11    (select t.cola parent, t.colb child
 12       from test t
 13     union all
 14     select a.parent, b.colb child
 15       from temp a join test b on a.child = b.cola
 16    )
 17  select *
 18  from temp
 19  order by parent, child;

PARENT     CHILD
---------- ----------
a          b
a          c
a          d
a          e
b          c
b          d
b          e
c          d
c          e
d          e

10 rows selected.

SQL>

使用分层查询 CONNECT_BY_ROOT:

SELECT CONNECT_BY_ROOT( ColumnA ) AS ColumnA,
       ColumnB
FROM   table_name
CONNECT BY PRIOR ColumnB = ColumnA

您的数据:

CREATE TABLE table_name ( ColumnA, ColumnB ) AS
SELECT 'A', 'B' FROM DUAL UNION ALL
SELECT 'C', 'D' FROM DUAL UNION ALL
SELECT 'D', 'E' FROM DUAL UNION ALL
SELECT 'B', 'C' FROM DUAL;

这输出:

COLUMNA | COLUMNB
:------ | :------
A       | B      
A       | C      
A       | D      
A       | E      
B       | C      
B       | D      
B       | E      
C       | D      
C       | E      
D       | E      

db<>fiddle here