小弟现在正在做一个公交公司的项目,有一个模块是公交线路查询的,其中涉及到公交换乘,客户给了2个视图,一个是站点视图(存放所有的站点信息,yy_line_station_view),一个是线路信息(存放所有的线路,yy_line_view),视图是他们原来就有的,不能做任何字段的修改,
下面这条语句是查询2路车所经过的站点:
select  s.* from yy_line_station_view s,yy_line_view l where s.LINE_ID=l.GIS_LINE_ID and l.LINE_NAME='2路' and up_or_down=0 order by sort_no asc;
其中两个视图是经过GIS_LINE_ID (是线路内码)和LINE_ID(站点视图中的线路ID,为内部编号)关联的,LINE_NAME是公交车线路名称,up_or_down=0(是上行还是下行0=上行,1=下行),sort_no是站点顺序,
下面这条语句是查询火车站这个站点所经过的线路信息:
select  s.* from yy_line_station_view s where line_id in (select s.line_id from yy_line_station_view s where station_name like '%火车站%') and up_or_down=0 order by line_id asc;
这条语句可以查询出所有经过火车站的线路信息
比如说“2路”经过A,B,C,D四个站点,
比如说第2条语句查询出3路和5路经过火车站,其中“3路经过,K,Y,L,U”4个站点,“5路经过”,E,Q,C,G四个站点,从信息可以看出3路没有和2路有交叉的站点,所以不能换乘,5路和2路都经过C站点,代表可以换成,怎么用一条SQL语句或过程查询出有重合站点的车辆信息,就像上面语句中2路和5路有C站点重合,就把2路和5路的信息查询出来,显示在页面上,望那位大虾帮一下小弟,(可以把上面2条语句整合一下,或者写个过程等)不胜感激。

解决方案 »

  1.   

    XD,下次最好把你的表结构解释一下 ...Just try it ..
    select tt.LINE_ID,
           tt.station_name,
           l.LINE_NAME
      from (
            select s.*,
                   l.LINE_NAME,
                   count(1) over(partition by s.LINE_ID) as count_lines
              from yy_line_view l,
                   yy_line_station_view s
             where s.LINE_ID=l.GIS_LINE_ID
               and s.up_or_down=0
           )tt
     where count_lines > 1
     order by 1;
      

  2.   

    是所有的站点嘛?
    对line_id进行Count,大于等于2的就把他们路线名拿出来就可以了。
    假如你的上行,下行的数据会有两条的话,用>2
    假如只是部分数据有,部分没有的话,就是说,只有上行,或者只有下行的话,就需要对原来的view再作一次筛选。