有一个公交线路的站点明细表,如下:
line_detail表:
id     line          direction     station_num      station
1       3800            上行             1                       站点a
2       3800            上行             2                       站点b
3       3800            上行             3                       站点c
4       3800            下行             1                       站点a
5       3800            下行             2                       站点b
6       3800            下行             3                       站点c现在我需要查询上下行两个两个站点的组合,先后顺序无所谓,查询得到的结果应该是这样的:
staion_shang    station_xia
  站点a                      站点b
 站点a                      站点c
 站点b                      站点c我写的sql语句是这样的:
 select  a.station , b.station from (select * from line_detail d1 where d1.direction='上行' and d1.line='3800') a,(select * from line_detail d1 where d1.direction='下行' and d1.line='3800') b
where a.station!=b.station这个sql查出来的结果一共有6个:
staion_shang    station_xia
  站点a                      站点b
 站点a                      站点c
 站点b                      站点c
 站点c                      站点b
 站点b                      站点a
 站点c                      站点a但因为我需要的结果不用考虑先后顺序,所以(  站点a , 站点b)和(  站点b, 站点a)我只要一个就可以了。
请教各位大神,这个sql语句要怎样写才能得到我要的结果呢?

解决方案 »

  1.   


    -- 你的结果 minus 一下,看看是不是你要的结果 select staion_shang, station_xia from mytable 
    minus
    select station_xia, staion_shang from mytable 
      

  2.   

    站点编号和站点名称在上行或下行线路里面应该是一样的,那就在连接时加个条件,在上行里面取1个站去和下行的所有站建立连接,这样试试:
    WITH ts AS
      (SELECT /*+ materialize */ * FROM ttt
      WHERE line=3800)
    SELECT DISTINCT s1.station,s2.station FROM ts s1
    INNER JOIN ts s2
    ON s1.station<>s2.station
    AND s1.station_num=1;
    或者用下面这种:
    WITH ts AS
      (SELECT /*+ materialize */ * FROM ttt
      WHERE line=3800)
    SELECT s1.station,s2.station FROM ts s1
    INNER JOIN ts s2
    ON s1.station<>s2.station
    AND s1.station_num=1
    AND S1.DIRECTION<>'上行'
    AND S2.DIRECTION<>'上行';
    数据量大第2种可能要快些。
      

  3.   

    where后改成a.station<b.station
    然后分组group by a.station,b.station
      

  4.   

    SELECT DISTINCT station,prestation 
      FROM (SELECT LINE,
                   DIRECTION,
                   STATION_NUM,
                   STATION,
                   LEAD(STATION) OVER(ORDER BY ID) PRESTATION
              FROM LINE_DETAIL)
     WHERE PRESTATION IS NOT NULL;