假设我有一个包含以下结构的表:
create table rd(r1 number,r2 number, primary key (r1,r2));
示例数据:
| R1 | R2 |
-----------
| 1 | 2 |
| 1 | 4 |
| 2 | 3 |
| 3 | 1 |
| 4 | 5 |
这意味着R1与R2双向相关。因此,如果数据库中存在1,3的条目,则不会有类似3,1的条目。
根据以上数据: 1直接与2,4,3相关。而且4也与1有关。因此,通过传递依赖性,1和5也被认为是相关的。
预期结果:
| R1 | R2 |
-----------
| 1 | 2 |
| 1 | 4 |
| 1 | 3 |
| 1 | 5 |
任何人都可以为此编写SQL查询吗?
答案 0 :(得分:3)
当您运行Oracle 11g(以及它恰好是第2版)时,作为其中一种方法,您可以使用递归公用表表达式(也称为递归子查询因子分析)to get desired result。 / p>
SQL> with rcte(r1, r2, lv, root) as(
2 select r1
3 , r2
4 , 0 lv
5 , r1
6 from rd
7 where r1 = 1
8
9 union all
10
11 select t.r1
12 , t.r2
13 , lv + 1
14 , q.root
15 from rd t
16 join rcte q
17 on (t.r1 = q.r2)
18 )
19 search depth first by r1 set s
20 cycle r1 set is_cycle to 'y' default 'n'
21
22 select root
23 , r2
24 from rcte
25 where is_cycle = 'n'
26 and r2 <> root
27 ;
ROOT R2
---------- ----------
1 2
1 3
1 4
1 5
答案 1 :(得分:0)
只要表中只有一个级别的中间值,以下查询就会起作用。
它的工作原理是将表扩展为单向表,然后将该表与将其连接到自身的结果进行组合。
WITH expanded AS
(SELECT r1, r2 FROM rd
UNION ALL
SELECT r2 AS r1, r1 AS r2 FROM rd)
SELECT * FROM
(SELECT r1, r2 FROM expanded -- direct relations
UNION
SELECT e1.r1 AS r1, e2.r2 AS r2 -- indirect relations
FROM expanded e1
INNER JOIN expanded e2
ON e1.r2 = e2.r1 -- via transitive dependency
AND e2.r2 <> e1.r1)
WHERE r1 = 1
ORDER BY r1, r2