有table  “user_tb”:
id      name   
1        aa   
2        bb      
-1       aa     
-2       ee     
4          ff     想得到结果集:
id name 
1   aa   
2   bb 
-2   ee  
4    ff 就是说当name字段有重复时只显示id为正数的记录,如:
记录 “1   aa” ,“-1   aa”只显示第一条记录请问怎么用一条查询语句实现?

解决方案 »

  1.   

    select * from user_tb t1
    where id>0 or
          not exist
          (select 1 from user_tb t2 where t1.name=t2.name and t2.id>0) 期待更好的...
      

  2.   

    select * from user_tb
    where (id,name) not in(
    select abs(id),name
    from user_tb
    group by abs(id),name
    having count(*)>1)
    or ((id,name) in(
    select abs(id),name
    from user_tb
    group by abs(id),name
    having count(*)>1) and id>0)
      

  3.   

    笨语句
    select * from user_tb
    where id>0
    union 
    select * from user_tb 
    where id<0
    and id not in (select id from user_tb where id>0)
      

  4.   

    ??是这个意思吗?
    SQL> select max(ut.sid) as sid,
      2         ut.sname
      3    from user_tb ut
      4   group by ut.sname;       SID SNAME
    ---------- ----------
             1 aa
             2 bb
            -2 ee
             4 ff
      

  5.   

    4楼的你的那个就有问题了;如果存在:
    id             name       
    1                 aa       
    2                 bb             
    -1               aa   
    3                aa正数中又多个name一样的;那么数据就少了;
      

  6.   

    T@ORA>select * from t;        ID N
    ---------- ----------
             1 aa
             2 bb
            -1 aa
            -2 ee
             4 ff
             3 aa6 rows selected.Elapsed: 00:00:00.12
    T@ORA>select id,n from (select id,n,rank() over (partition by abs(id),n order by (id) desc,n) r from t )  where r = 1;        ID N
    ---------- ----------
             1 aa
             2 bb
            -2 ee
             3 aa
             4 ffElapsed: 00:00:00.09
    T@ORA>
      

  7.   

    select name,max(id)
    from user_tb
    group by name
      

  8.   

    谢谢各位指点,我来说说我的结果:
    1楼,2楼,3楼 结果虽然是正确的,但是当user_tb是一个很大的结果集或是多表关联查询时明显效率会下降;
    4楼,7楼 正如5楼所说,当数据为:
    ID    NAME
    1 aa
    2 bb
    -5 aa
    -7 ee
    4 ff 
    3 aa
    时,记录“3 aa”是查不到的;6楼的方法我觉得很好,但当数据集为以上情况时记录“3 aa”也是查不到的,所以我修改为select id, name
      from (select id,
                   name,
                   case
                     when count(*) over(partition by name) > 1 and id < 0 then
                      0
                     else
                      1
                   end r
              from user_tb)
     where r=1;不知道还有没有更好的方法。
      

  9.   

    说错了,6楼的方法不是查不到记录“3 aa” ,而是去不掉“-5 aa”
      

  10.   

    select * from user_tb where rowid in (select min(rowid) from user_tb group by id, name)