我有这张桌子:
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"显示匹配的完整图表。
感谢。
答案 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))