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
如果我有以下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