小弟新手,最近在正在学sql,向大家请教一个问题:
发现oracle提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。也就是distinct只能返回它的目标字段,而无法返回其它字段。
比如说:
一张表:
ID NAME
---------- --------------------
 1 a
 2 b
 3 c
 4 c
 5 b
-------------------------------
怎么用sql查询得到这么个结果:
ID NAME
---------- --------------------
 1 a
 2 b
 3 c
--------------------------------
我试过的结果:
select distinct name from table
得到的结果是:  name
  a
  b
  c好像达到效果了,可是,没有想要的id值呢,改查询语句:select distinct name, id from table结果会是:  id name
  1 a
  2 b
  3 c
  4 c
  5 bdistinct同时作用了两个字段。
到底怎么办???
跪求各位高手

解决方案 »

  1.   

     select distinct name,min(id) from table group by name;
      

  2.   

    忘了order by
     select distinct name,min(id) as id from a group by name order by id;
      

  3.   


    单独的distinct 是做不到的,decode() 很好用,分组也可以.
      

  4.   

    with temp as(
    select 1 id,'a' name from dual
    union all
    select 2 id,'b' name from dual
    union all
    select 3 id,'c' name from dual
    union all
    select 4 id,'c' name from dual
    union all
    select 5 id,'b' name from dual
    )
    select distinct min(id) id, name from temp group by name;结果:
    id      name
    1 a
    2       b
    3 c
      

  5.   

    好像这个和distinct没有关系哟。不用distinct也可以达到这样的效果。
    select name,min(id) as id from a group by name ;
      

  6.   

    select * from table where name in (select distinct name from table);
      

  7.   

    上面写的不对!不知道你到底想要哪个ID号码?比如name :a 对应两个ID,你是要大的ID,还是要小的ID号?如果这个不能确定的话没办法写的!
      

  8.   

    你的需求可以使用group by来实现
    SQL> select * from t1;        ID NAME
    ---------- ----------
             1 a
             2 b
             3 c
             4 c
             5 bSQL> select min(id),name
      2  from t1
      3  group by name;   MIN(ID) NAME
    ---------- ----------
             1 a
             2 b
             3 c
      

  9.   

    distinct用在这里没有意义,省略distinct也是一样的效果。
      

  10.   

    select name,min(id) as id from table_test group by name order by id;
    select name,max(id) as id from table_test group by name order by id;
      

  11.   

    你的sql语句意思:取出符合原表name字段的的值的所有行信息,得出的结果明显还是原表结果....
      

  12.   

    select name,min(id) from tb group by name
    这写法明显是错的, 逻辑都不对, 按name聚合,取了最小id聚合值。试想还有第三列, 如何得到原记录? 说结果对,也只是因为仅有两列,凑巧罢了。http://topic.csdn.net/u/20080123/18/9731d130-0d4b-4c11-8d89-f2c3ca331f0c.html
      

  13.   

    再加一行,name字段相同。
    SQL> select * from test_lwc; ID NAME
    ---------- --------------------
     3 c
     1 a
     2 b
     5 b
     4 c
     6 b6 rows selected.SQL> select min(id) ,name from test_lwc group by name;   MIN(ID) NAME
    ---------- --------------------
     1 a
     2 b
     3 c
    一样可以啊,不明白你的意思。
      

  14.   

    是加列,不是加行id name n
    1  aa   13
    2  aa   9
    3  bb   51
    4  bb   12要选出id,name,n
    你如何聚合?
    select name,min(id),min(n) from tb
    结果是
    aa 1,9
    bb 3,12
    这是聚合结果,不是原始数据行。获得原始数据行解法,我那个链接里已经有了。
    当然用row_number也会有很多写法。