有一张表:
  起始地       目的地       距离
    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) ,该怎么查?

解决方案 »

  1.   

    select 起始地,目的地,距离 
    from t
    start with 起始地='A'
    connect by prior 目的地=起始地;
    这个查询就是你要的结果了,但是不知道你想怎样把这个结果更好的展现出来。
      

  2.   

    SQL> select * from test;A                    B                             C
    -------------------- -------------------- ----------
    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行。
      

  3.   


    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