如果我有下表:
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;
此输出:
列|哥伦比亚:------ | :------A |乙A | CA | dA | ËB | CB | dB | ËC | dC | ËD | Ë
db <>小提琴here
您只需要使用CROSS JOIN
和greatest()
函数在这两列中包含不等式的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