有一个这样的表:ID  NAME_ID  SIT_CD  F_NN
1   1234      99     jkak
2   1234      98     hjhj
3   1234      91     cccc
4   1235      76     ffff
5   1235      44     fggf
6   1236      98     ddss要求取出NAME_ID相同的行(SIT_CD最小的行)
最后结果是:
ID  NAME_ID  SIT_CD  F_NN
3   1234      91     cccc
5   1235      44     fggf
6   1236      98     ddss请问行家这个SQL怎么写呀!

解决方案 »

  1.   

    select * from tablename where SIT_CD in(select min(SIT_CD) from tablename group by NAME_ID)
      

  2.   

    这样不行,因为 select min(SIT_CD) from tablename group by NAME_ID得到的结果是:NAME_ID相同是的最小SIT_CD,这个SIT_CD可能是相同的比如说:
    1   1234      99     jkak
    2   1234      98     hjhj
    3   1234      91     cccc
    4   1266      91     dddd
    这样就不能取得了!
      

  3.   

    select ID,destinct NAME_ID,min(sit_cd) SIT_CD,F_NN from tab_name group by NAME_ID
      

  4.   

    这种方案更不可取,因为group by NAME_ID 时只能取出select destinct NAME_ID,min(sit_cd) SIT_CD   而另外的字段取不出来
      

  5.   

    caixia615(┌睜眼為殤.2ǒǒ6.閉眼為塵┐)  
     是正确的啊,在最后有个group by Name_ID,肯定不会出现相同Name_ID的记录的,你有没有在代码中试过啊,应该是可以的啊,你试一下就知啦
      

  6.   

    select NAME_ID,
    min(ID    )KEEP (DENSE_RANK FIRST ORDER BY SIT_CD) ID,
    min(F_NN  )KEEP (DENSE_RANK FIRST ORDER BY SIT_CD) F_NN ,
    min(SIT_CD)KEEP (DENSE_RANK FIRST ORDER BY SIT_CD) SIT_CD
    from t
    group by NAME_ID
      

  7.   

    select b.* from 表名 b inner join (select NAME_ID,min(SIT_CD) SIT_CD from 表名 group by NAME_ID) a on b.NAME_ID = a.NAME_ID and b.SIT_CD = a.SIT_CD
      

  8.   

    Connected to Oracle9i Enterprise Edition Release 9.2.0.6.0 
    Connected as chanetSQL> 
    SQL> CREATE TABLE tab_csdn(fid NUMBER(1), name_id NUMBER(4), sit_id NUMBER(2), f_nn VARCHAR2(5));Table createdSQL> INSERT INTO tab_csdn(fid, name_id, sit_id, f_nn) VALUES(1, 1234, 99, 'jkak');1 row insertedSQL> INSERT INTO tab_csdn(fid, name_id, sit_id, f_nn) VALUES(2, 1234, 98, 'hjhj');1 row insertedSQL> INSERT INTO tab_csdn(fid, name_id, sit_id, f_nn) VALUES(3, 1234, 91, 'cccc');1 row insertedSQL> INSERT INTO tab_csdn(fid, name_id, sit_id, f_nn) VALUES(4, 1235, 76, 'ffff');1 row insertedSQL> INSERT INTO tab_csdn(fid, name_id, sit_id, f_nn) VALUES(5, 1235, 44, 'fggf');1 row insertedSQL> INSERT INTO tab_csdn(fid, name_id, sit_id, f_nn) VALUES(6, 1236, 98, 'ddss');1 row insertedSQL> select * from tab_csdn;FID NAME_ID SIT_ID F_NN
    --- ------- ------ -----
      1    1234     99 jkak
      2    1234     98 hjhj
      3    1234     91 cccc
      4    1235     76 ffff
      5    1235     44 fggf
      6    1236     98 ddss6 rows selectedSQL> SELECT fid, name_id, sit_id, f_nn
      2    FROM (SELECT t.*, row_number() over(PARTITION BY name_id ORDER BY sit_id) rn
      3            FROM tab_csdn t)
      4   WHERE rn = 1
      5  /FID NAME_ID SIT_ID F_NN
    --- ------- ------ -----
      3    1234     91 cccc
      5    1235     44 fggf
      6    1236     98 ddssSQL>
      

  9.   

    SQL> drop table tab_csdn;Table dropped
      

  10.   

    SELECT fid,name_id,sit_id,f_nn FROM (SELECT tab_name.*,rank() over(PARTITION BY name_id ORDER BY sit_id) rk FROM tab_name) where rk=1;
      

  11.   

    select a.ID, a.NAME_ID, a.SIT_CD, a.F_NN 
    from theTable a
    where not exists (select 1 from theTable b where b.ID=a.ID and b.SIT_CD<a.SIT_CD)
      

  12.   

    select t1.fid, t1.value, t1.name_id, t1.f_nn
      from (select a.*,
                   first_value(a.sit_id) over(partition by a.name_id order by a.sit_id) value
              from tab_csdn a) t1
     where t1.sit_id = t1.value
      

  13.   

    怎么还没有结贴?我给你一个最简单也是最有效的,select min(SIT_CD) from tablename where group by NAME_ID;
      

  14.   

    Sorry,select min(SIT_CD) from tablename group by NAME_ID;
      

  15.   

    min()是组函数,可以和group by 一起用.
      

  16.   

    select * from tablename t where t.ID in 
    (select b.ID from tablename b where b.SIT_CD in
    (select min(c.SIT_CD) from tablename c group by c.NAME_ID)) ;
      

  17.   

    select * from tablename where (name_id,sit_code) in
    (select name_id,min(SIT_CD) from tablename group by NAME_ID )
    可能能达到要求.
      

  18.   

    select id,name_id,sit_cd,f_nn from 
    (select b.*,row_number() over(partition by name_id order by sit_cd) v_name_id
    from b ) where v_name_id<2
      

  19.   

    select a.* from 表名 a,
    (select name_id,min(SIT_CD) as minid from 表名 group by name_id) b 
    where a.name_id=b.name_id and a.SIT_CD=b.minid
      

  20.   

    SELECT a.* FROM table_a a,(SELECT name_id,MIN(sit_id) min_sit_id FROM table_a GROUP BY name_id) b
    WHERE a.name_id=b.name_id AND a.sit_id=b.min_sit_id;
      

  21.   

    这样更简单:
    select * from tablename where SIT_CD+NAME_ID in(select min(SIT_CD+NAME_ID) from tablename group by SIT_CD+NAME_ID)
      

  22.   

    www.9share.net 不错的资料下载网站