有一张表:
起始地 目的地 距离
A B 2000
A C 1000
A D 500
B F 300
B M 1000
C G 800
G F 600
请问,要查出从A出发所能到达的地方,包括直接的和间接的(例如:A-C-G-F) ,该怎么查?
起始地 目的地 距离
A B 2000
A C 1000
A D 500
B F 300
B M 1000
C G 800
G F 600
请问,要查出从A出发所能到达的地方,包括直接的和间接的(例如:A-C-G-F) ,该怎么查?
调试欢乐多
from t
start with 起始地='A'
connect by prior 目的地=起始地;
这个查询就是你要的结果了,但是不知道你想怎样把这个结果更好的展现出来。
-------------------- -------------------- ----------
A B 2000
A C 1000
A D 500
B F 300
B M 1000
C G 800
G F 600已选择7行。SQL> select 'A',sys_connect_by_path(b,'->') path
2 from test
3 start with a = 'A'
4 connect by a = prior b;'A PATH
-- ----------------------------------------------------
A ->B
A ->B->F
A ->B->M
A ->C
A ->C->G
A ->C->G->F
A ->D已选择7行。
create table tt (s char(1),e char(1),space int);
CREATE OR REPLACE FUNCTION str_to_number(p_str VARCHAR2) RETURN NUMBER AS
r NUMBER;
BEGIN
EXECUTE IMMEDIATE 'select '||p_str||' from dual' INTO r;
RETURN r;
END;
/
INSERT INTO TT VALUES ('A', 'B', 2000);
INSERT INTO TT VALUES ('A', 'C', 1000);
INSERT INTO TT VALUES ('A', 'D', 500);
INSERT INTO TT VALUES ('B', 'F', 300);
INSERT INTO TT VALUES ('B', 'M', 1000);
INSERT INTO TT VALUES ('B', 'E', 400);
INSERT INTO TT VALUES ('C', 'G', 800);
INSERT INTO TT VALUES ('G', 'F', 600);
INSERT INTO TT VALUES ('F', 'H', 100);
INSERT INTO TT VALUES ('F', 'I', 200);
INSERT INTO TT VALUES ('F', 'J', 300);
COMMIT;SELECT 'A' || SYS_CONNECT_BY_PATH(E, '->') PATH,SPACE,
str_to_number(LTRIM(SYS_CONNECT_BY_PATH(SPACE, '+'), '+')) 累积距离
FROM TT
START WITH S = 'A'
CONNECT BY PRIOR E = S;输出:
PATH SPACE 累积距离
A->B 2000 2000
A->B->F 300 2300
A->B->F->H 100 2400
A->B->F->I 200 2500
A->B->F->J 300 2600
A->B->M 1000 3000
A->B->E 400 2400
A->C 1000 1000
A->C->G 800 1800
A->C->G->F 600 2400
A->C->G->F->H 100 2500
A->C->G->F->I 200 2600
A->C->G->F->J 300 2700
A->D 500 500