Oracle SQL вложенные отношения на уровне - PullRequest
0 голосов
/ 26 марта 2020

Если у меня есть следующая таблица:

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 справиться с этим? Или нужно PL SQL?

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Используйте иерархический запрос с 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      

дБ <> скрипка здесь

0 голосов
/ 26 марта 2020

Рекурсивный 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>
...