SQL Query查找所有可能的路径

时间:2011-02-23 21:57:52

标签: sql oracle

我有这张桌子:

create table testtb (c1 number, c2 number);
insert into testtb values (1, 100);
insert into testtb values (2, 100);
insert into testtb values (3, 100);
insert into testtb values (3, 101);
insert into testtb values (4, 101);
insert into testtb values (5, 102);
commit; 

我很难提出SQL查询,当where子句是这样的时候会返回以下结果:" c2 = 100"

结果集:

c1 c2
-- ---
1  100
2  100
3  100
3  101
4  101

结果集包含" 3,101"是因为它可通过" 3,100"到达。同样适用于" 4,101" :可通过 - > " 3101" - > " 3100"

更新:此表包含相似性加入后来自2个不同数据集的标识符。因此,我们的想法是允许用户通过任何标识符进行搜索,并显示两个数据集之间的所有可能匹配。这就是为什么当用户搜索" c2 = 100"我也希望展示" 3,101"和" 4,101"显示匹配的完整图表。

感谢。

3 个答案:

答案 0 :(得分:4)

select distinct c1, c2
from testtb
connect by nocycle prior c1 = c1 or prior c2 = c2
start with c2 = 100
order by c1, c2;

答案 1 :(得分:3)

与jonearles回答相同,但使用递归子查询因子:

  WITH pathtb(c1,c2) AS
  (
  SELECT c1,c2 FROM testtb WHERE c2=100
  UNION ALL
  SELECT testtb.c1,testtb.c2 FROM
     testtb JOIN pathtb ON (pathtb.c1=testtb.c1 or pathtb.c2=testtb.c2)
  ) CYCLE c1,c2 set cycle TO 1 default 0
  SELECT DISTINCT c1,c2 FROM pathtb WHERE cycle=0
  ORDER BY c1,c2

答案 2 :(得分:1)

尝试使用子查询...从您的初始帖子中推断出这一点,希望它有所帮助。

select * from testtbl where c1 in (select c1 from testtbl where c2=100)

(我是一名MSSQL人员,如果这不能将100%映射到PL-SQL但您明白了这一点,那么我很抱歉)

编辑: 对不起,我看到你也想要4,101。也许两级子查询呢?

    select *
    from testtbl
    where c2 in
    (select c2 from testtbl where c1 in (select c1 from testtbl where c2=100))