一个表tb1,有如下字段:
出发地 目的地
a b
a c
a d
b c
c e
d f
e g
g a
f h
问从出发地a可以到达的所有目的地,包括间接到达的,比如包括目的地e,用sql或程式实现均可,请高手赐教
出发地 目的地
a b
a c
a d
b c
c e
d f
e g
g a
f h
问从出发地a可以到达的所有目的地,包括间接到达的,比如包括目的地e,用sql或程式实现均可,请高手赐教
解决方案 »
- 这个该怎么写
- 这样的sql怎么写
- ORA-12528:all appropriate instances are blocking
- 【求助】一个令人郁闷的问题--插入的数据无法显示
- 数据库远程连接失败?
- ~~怎样追踪一段时间内对数据库中的表进行的操作~~
- Oracle下面的数据连接的兼容性问题
- 求救!为什么老是提示“无法解析连接描述符中指定的SID“啊?在线等!谢谢先!
- 我想使用oracle+php来建立一个电子商务的站点,需要人手帮忙!
- 有一个简单的问题想问大家,关于存储过程的。
- WINXP下10g客户端连接linux 10g服务端问题及如何plsqldev如何连接linux 10g服务端问题!
- weblogic读取oracle数据表信息
connect by
C1 C2
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
a d
a c
a b
b c
c e
d f
e g
f h
8 rows selected
SQL>
SQL> select sys_connect_by_path(c1, '-')
2 from pp_test
3 start with c1 = 'a' connect by prior c2 = c1;
SYS_CONNECT_BY_PATH(C1,'-')
--------------------------------------------------------------------------------
-a
-a
-a-c
-a-c-e
-a
-a-b
-a-b-c
-a-b-c-e
8 rows selected
SQL>
5楼的答案很好啊,如果在前面再加一个distinct就完美了,呵呵:)
select distinct sys_connect_by_path(c1, '-')
from pp_test
start with c1 = 'a' connect by prior c2 = c1;
create or replace function ffindmd(c_cf varchar2)
return varchar2
is
type tb1_cursor_type is ref cursor;
tb1_cursor tb1_cursor_type;
amount int:=0;
v_cf tb1.cf%type;
res varchar2(500);
v_temp tb1.cf%type;
begin
select count(*) into amount from tb1 where cf=c_cf and md<>'a';
if amount=0 then
return '';
else
open tb1_cursor for select md from tb1 where cf=c_cf and md<>'a';
dbms_output.put_line('出发点:'||c_cf);
loop
fetch tb1_cursor into v_cf;
exit when tb1_cursor%notfound;
dbms_output.put_line(c_cf||'的目的:'||v_cf);
--res:=res||' , '||v_cf;
v_temp:=ffindmd(v_cf);
res:=res||v_temp||v_cf;
--dbms_output.put_line(res);
end loop;
close tb1_cursor;
--dbms_output.put_line(res);
return res;
end if;
end ffindmd;
select ffindmd('a') from dual ;结果我没有去掉重复的..重复的用字符串处理下就是了
SQL> select distinct 'a' || sys_connect_by_path(p2, '-') from PP_TEXT start with p1 = 'a' connect by
prior p2 = p1;'A'||SYS_CONNECT_BY_PATH(P2,'-')
--------------------------------------------------------------------------------
a-b
a-b-c
a-b-c-e
a-b-c-e-g
a-c
a-c-e
a-c-e-g
a-d
a-d-f
a-d-f-h10行が選択されました。在5楼的基础上做的
distinct substr(path,length(path),1)
from
(
select distinct sys_connect_by_path(trim(c1), '-') path from pp_test start with c1 = 'a' connect by prior c2 = c1
);
需要先
delete from pp_test
where c2 = 'a';
from (select a,b from testroad where b!='a') t
start with t.a = 'a' connect by prior t.b = t.a
;