我知道:当表中的bus_stop_count列中有唯一的最小值时,程序返回的是这一行的值;
但是当表中存在两个或多个相等地最小值时(如上表),则报错。
请问,当出现上述问题时,我想返回表中相同最小值中的第一行时,程序应该怎么写?
谢谢!!!

解决方案 »

  1.   

    比较简单的办法是使用游标。
    还可以改造你的sql------------------------
    |                      |
    |   相逢何必曾相识     |
    |                      |
    ------------------------
      

  2.   

    SELECT BUS_STOP_COUNT,BUS_NAME INTO i_busstop_count,i_name
    FROM tb_result1_temp 
    WHERE rowid=
    (select min(rowid) from (select min(BUS_STOP_COUNT) from tb_result1_temp))
    ------------------------
    |                      |
    |   相逢何必曾相识     |
    |                      |
    ------------------------
      

  3.   

    to jiezhi:
    我用了你的方法,但是却出现错误:rowid不能用于group by建立的视图。
    请再帮忙呀!!
      

  4.   

    SELECT 
    BUS_STOP_COUNT,
    BUS_NAME,
    INTO 
    i_busstop_count,
    i_name,
    FROM (select * from tb_result1_temp order by BUS_STOP_COUNT desc ,BUS_NAME desc)
    WHERE 
    rownum <2
      

  5.   

    不好意思,上面的语句不要DESC
    SELECT 
    BUS_STOP_COUNT,
    BUS_NAME,
    INTO 
    i_busstop_count,
    i_name,
    FROM (select * from tb_result1_temp order by BUS_STOP_COUNT ,BUS_NAME )
    WHERE 
    rownum <2
      

  6.   

    典型的错误,select语句返回多个值,too_many_rows,用游标解决:DECLARE
      i_busstop_count tb_resultl_temp.bus_stop_count%type;
      i_name tb_resultl_temp.bus_name%type;
      cursor cur1 is 
        SELECT BUS_STOP_COUNT,BUS_NAME,
          FROM tb_result1_temp 
         WHERE BUS_STOP_COUNT=(select min(BUS_STOP_COUNT) 
                                 from tb_result1_temp)
         GROUP by BUS_STOP_COUNT,BUS_NAME; 
    BEGIN
      open cur1;
      loop
      exit when cur1%notfound;
        fetch cur1 into i_busstop_count ,i_name;
        dbms_output.put_line(v_empno||v_ename);
      end loop;
      close cur1;
    END;
      

  7.   

    用一个唯一标识它们
    SELECT 
    BUS_STOP_COUNT,
    BUS_NAME,
    INTO 
    i_busstop_count,
    i_name,
    FROM tb_result1_temp a
    where exists(select min(BUS_STOP_COUNT) from tb_result1_temp where id=a.id group by BUS_STOP_COUNT,BUS_NAME); 
    速度上比较可取.
      

  8.   

    to beckhambobo:
    谢谢,但问题是在这个表中的id列不是唯一的,该表的主键是(id,bus_name)的组合键,我该怎么办呀!请帮忙呀!
      

  9.   

    SELECT BUS_STOP_COUNT,BUS_NAME INTO i_busstop_count,i_name
    FROM tb_result1_temp 
    WHERE BUS_STOP_COUNT=( select count from 
    (select min(BUS_STOP_COUNT) count from tb_result1_temp) where rownum<2 )
    GROUP by BUS_STOP_COUNT,BUS_NAME;              
      

  10.   

    SELECT 
    BUS_STOP_COUNT,
    BUS_NAME,
    INTO 
    i_busstop_count,
    i_name,
    FROM tb_result1_temp 
    WHERE BUS_STOP_COUNT=(select min(BUS_STOP_COUNT) from tb_result1_temp) and rownum=1 
    GROUP by 
    BUS_STOP_COUNT,
    BUS_NAME;              
      

  11.   

    为何该表的主键是(id,bus_name)的组合键,看结构上是不合理,重修改表结构.
    id,bus_name联合主键不会产生什么作用!!
      

  12.   

    to beckhambobo:
    对不起,其实是主键是(id,order)的组合键,order列是后来加上去的,该列表示了乘车的顺序,只有两个值:p和n,这样做是为了防止出现单向站点的情况,即有的站点在正向的时候经过而在逆向的时候没有被经过,所以说id列并不是主键。
    那么在这种情况下,怎样修改您的程序呢?请指教呀!!谢谢
      

  13.   

    先试试:
    select distinct tab.nm1,tab.nm2  from 
     (select bus_stop_count nm1,bus_name nm2 from tb_result1_temp  where bus_stop_count=(select min(bus_stop_count)  from tb_result1_temp ) group by bus_stop_count) tab
    into i_busstop_count,i_name;若不行,建议再建立一个临时表,把group by 的若干条满足条件的记录存入,再从此临时表中用distinct语句取出第一条记录送入i_busstop_count,i_name两变量中。
      

  14.   

    select BUS_STOP_COUNT,BUS_NAME 
    INTO i_busstop_count,i_name  from 
    (SELECT
    BUS_STOP_COUNT,
    BUS_NAME
    FROM lsb
    WHERE ( BUS_STOP_COUNT)=(select min(BUS_STOP_COUNT) from lsb) and rownum=1  
    GROUP by
    BUS_STOP_COUNT,
    BUS_NAME )
      

  15.   

    SELECT 
    BUS_STOP_COUNT,
    BUS_NAME,
    INTO 
    i_busstop_count,
    i_name,
    FROM tb_result1_temp a
    where exists(select min(BUS_STOP_COUNT) from tb_result1_temp where id=a.id and order=a.order group by BUS_STOP_COUNT,BUS_NAME);
      

  16.   

    谢谢大家的帮助,问题已经解决了,我用的是nbnasom(阿飞)的方法!