表中就两个字段,name 和 id,我想查询出name不同的记录:
select name,(select id from table1 t where t.name = a.name and rownum < 2) id from table1 a;
——这样写不好使,name相同的记录还是会列出来
select name,(select id from table1 t where t.name = a.name and rownum < 2) id from table1 a group by name;
——加了group by name后结果正确;请教下为什么要加group by name,我觉得第一条语句已经能达到效果了,可为什么不好使?
谢谢~!

解决方案 »

  1.   

    (select id from table1 t where t.name = a.name and rownum < 2)起到类似聚合函数的作用;
    第一句没有group by分组,就相当于在整个表范围内查询,所以有重复的name;
    第二句按name分组,(select id from table1 t where t.name = a.name and rownum < 2)的范围变成了每个不同的name,这样就查询出name不同的记录了
      

  2.   

    后面不是注释了吗
    ——这样写不好使,name相同的记录还是会列出来
    group by 只是为了去重复而已
    如果你的第一句就能达到效果,没哟重复数据,就没必要group by 了
      

  3.   

    那第一条语句中的rownum < 2 为什么不起作用?这个有点不明白
      

  4.   

    ...起作用了,没起作用的话就出错了
    重复的是name,而不是那个子查询
      

  5.   

    第一句子查询起作用了,重复的是name;在第二句加了group by之后,name不重复了,(而你的子查询是没变的),结果正确了。
      

  6.   

    select name,(select id from table1 t where t.name = a.name and rownum < 2) id from table1 a;
    这个是会列出重复的记录的第二条用group by已经去除了重复记录,然后选出的结果集在来做id的子查询而第一条,结果集已经先返回所有的记录了。
      

  7.   

    group by 其实就相当于distinct,起到去重的作用,但是又起到分组的作用
    如果在第一句加个distinct也可以
      

  8.   

    rownum < 2  没有起到挑出重复数据作用。
      

  9.   

    select name, id from table1 a
    where not exists(select 1 from table1 b where a.name=b.name and a.id=b.id);