Oracle SQL嵌套关系到级别上

问题描述 投票:0回答:3

如果我有下表:

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?

sql oracle hierarchical-data
3个回答
0
投票

递归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>

0
投票

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;

此输出:

列|哥伦比亚:------ | :------A |乙A | CA | dA | ËB | CB | dB | ËC | dC | ËD | Ë

db <>小提琴here


0
投票

您只需要使用CROSS JOINgreatest()函数在这两列中包含不等式的least()

SELECT least(t1.ColumnA,t2.ColumnB) AS ColumnC, 
       greatest(t1.ColumnA,t2.ColumnB) AS ColumnD
  FROM t t1
 CROSS JOIN (SELECT DISTINCT ColumnB FROM t ) t2
 WHERE t1.ColumnA != t2.ColumnB 
 GROUP BY least(t1.ColumnA,t2.ColumnB), greatest(t1.ColumnA,t2.ColumnB)
 ORDER BY ColumnC, ColumnD

Demo

© www.soinside.com 2019 - 2024. All rights reserved.