PLSQL,HIBERNATE,一张表(care)中的两个字段a,b
id   a   b 
1    10  20
2    20  30
3    10  15
4    20  40
5    10  20
6    30  30
7    30  50
8    20  30 我要按 a和b(同时作用) 来分组查出 表达所有内容(care.*),
如果单单查a和b的话,一个GROUP BY或者DISTINCT就可以了
select a,b from care group by a,b
结果是:
a   b
10  20
20  30
10  15
20  40
30  30
30  50但是 group by要求 SELECT 的选项要属于 GROUP BY 的集合,所以不能 select * from care group by a,b
我要的结果就是 id  a   b
 1  10  20
 2  20  30
 3  10  15
 4  20  40
 5  30  30
 6  30  50
能不能用一条或两条语句就查出来,之前我是用循环做的,先GROUP BY出a和b,再按a和b的集合去作为 select * from 的条件取一条来 循环查询,但是数据量大的时候效率就低了,有没有更好的办法

解决方案 »

  1.   

    select id,a,b from (select care.*,row_number() over(partition by a,b order by id) rn) where rn=1
      

  2.   

    select id,a,b from (select care.*,row_number() over(partition by a,b order by id) rn from care) where rn=1
      

  3.   

    select row_number() over(order by a , b) id , a , b from
    (
      select distinct a , b  from tb
    ) t
      

  4.   

    成功了,谢谢高手,row_number() over和partition by 是什么啊,我从来没见过啊
      

  5.   

    select rownum ,a ,b from ( select distinct a,b from care );
      

  6.   

    在PLSQL里可以查,但是用HIBERNATE 的 createQuery 的时候,无法识别 row_number() over和partition by ,这时候要怎么办啊
      

  7.   

    在数据库中先建个视图
    create or replace view v_care
    as
    select id,a,b from (select care.*,row_number() over(partition by a,b order by id) rn from care) where rn=1然后用 select * from v_care就顺利完成了