就是一个图遍历的算法嘛。我以前写过类似的找最短路径的SQL,写游标遍历和写循环都可以实现在此建议你好好想几天自己写,写出来之后你的算法和SQL会有一个质的飞跃~~~~

解决方案 »

  1.   

    没想出啥特别的算法,把A-E的组合数的排列方法放到...中,注意把前一条的终点站=次一条起始站的两条纪录的最终终点站必须是E,作为条件。
    --------->
    select a.车型 as 车型,
       (case when ... then 
            ...
       case when ... then 
            ...
       end ) AS   线路,  b.票价 as 票价
    from
       (select 车型 ,count(*) from 表 group by 车型) a,
       表 b
    where 
        a.车型=b.车型
      

  2.   

    给 sasacat(傻傻猫) 的问题:你得多少分?
      

  3.   

    楼主,表中是否也有返程记录,即:
     车型    起始站     终点站      票价
    依维柯     A          E          200
    依维柯     E          A          200
    依维柯     C          E          90
    依维柯     E          C          90
    依维柯     A          C          80
    依维柯     C          A          80这样的话,从C到A可以C-A,也可以C-E-A,这算不算迂回?
      

  4.   

    to watefirer:
    表中不存在返程记录。
    谢谢各位的回复!!
      

  5.   

    to licsth:
    你的这种办法好像有点行不通,无法得到结果。
      

  6.   

    如果没有返程记录,那你说的迂回也就不存在了。select 
        substr(sys_connect_by_path(起始站,'-'),2,length(sys_connect_by_path(起始站,'-'))) || '-' || 终点站 线路,
        substr(sys_connect_by_path(票价,'+'),2,length(sys_connect_by_path(票价,'+'))) 票价 from 
        表 
    where 
        终点站=E connect by prior 终点站=起始粘 start with 起始粘=A;
      

  7.   

    给你个思路,不过只能求到路径和票价的表达式,要得到票价的结果可以在代码里实现,不行的话只有用过程实现了,sql语句要得到票价结果也可以,只是语句太麻烦了,反而效率低,希望有人有更好的办法SQL> select * from t;TYPES                STARTS               GOALS                      FARE
    -------------------- -------------------- -------------------- ----------
    依维柯               A                    E                           200
    依维柯               A                    D                           180
    依维柯               A                    B                            70
    依维柯               B                    E                           120
    依维柯               A                    C                            80
    沃尔沃               A                    E                           260
    沃尔沃               A                    B                            60
    沃尔沃               B                    E                           180
    依维柯               B                    C                            60
    依维柯               C                    E                            90
    依维柯               C                    D                            5011 rows selectedSQL> SELECT TYPES,
      2         SUBSTR(SYS_CONNECT_BY_PATH(STARTS, '-') || '-' || GOALS, 2) ROUTE,
      3         SUBSTR(SYS_CONNECT_BY_PATH(FARE, '+'), 2) FARE
      4  FROM   t
      5  WHERE  GOALS = 'E'
      6  START  WITH STARTS = 'A'
      7  CONNECT BY STARTS = PRIOR GOALS
      8      AND    TYPES = PRIOR TYPES
      9  /TYPES                ROUTE                FARE
    -------------------- -------------------- --------------------
    沃尔沃               A-E                  260
    沃尔沃               A-B-E                60+180
    依维柯               A-E                  200
    依维柯               A-B-E                70+120
    依维柯               A-B-C-E              70+60+90
    依维柯               A-C-E                80+906 rows selected
      

  8.   

    :)不错!
    主要还是SYS_CONNECT_BY_PATH以及connect by start with的用法的展现!