[A]8i以上版本
select * from (select * from tablename order by sys_guid()) where rownum < N;
select * from (select * from tablename order by dbms_random.value) where rownum< N;
注:dbms_random包需要手工安装,位于$ORACLE_HOME/rdbms/admin/dbmsrand.sql
dbms_random.value(100,200)可以产生100到200范围的随机数
[Q]抽取从N行到M行的记录,如从20行到30行的记录
[A]select * from (select rownum id,t.* from table where ……
and rownum <= 30) where id > 20;
[Q]怎么样实现分组取前N条记录
[A]8i以上版本,利用分析函数
如获取每个部门薪水前三名的员工或每个班成绩前三名的学生。
Select * from
(select depno,ename,sal,row_number() over (partition by depno
order by sal desc) rn
from emp)
where rn<=3
[Q]如何取得一列中第N大的值?
[A]select * from
(select t.*,dense_rank() over (order by t2 desc) rank from t)
where rank = [$N]
实例:
1
建立測試環境
2
create table 表(學生名稱 varchar(10),學生性別 varchar(10),年齡 int,所屬班級 varchar(10),分數 int)
3
insert 表 select '張三','男',18,'三年一班',85
4
union all select '張四','男',18,'三年一班',90
5
union all select '張五','男',18,'三年一班',84
6
union all select '張六','男',18,'三年一班',75
7
union all select '李三','男',18,'三年二班',96
8
union all select '李四','男',18,'三年二班',82
9
union all select '李五','男',18,'三年二班',86
10
union all select '李六','男',18,'三年二班',74
11
union all select '王一','男',18,'四年一班',85
12
union all select '王二','男',18,'四年一班',86
13
union all select '王三','男',18,'四年一班',84
14
union all select '王四','男',18,'四年一班',75
15
go
16
select * from 表
17
第一中方法
18
select * from 表 a
19
where 分數 in(
20
select top 3 分數 from 表 where 所屬班級=a.所屬班級
21
order by 分數 desc)
22
23
1
第二中方法
2
select * from 表 a
3
where 學生名稱 in(
4
select top 3 學生名稱 from 表 where 所屬班級=a.所屬班級
5
order by 分數 desc)
6
order by 所屬班級,分數 desc
7
8
第三中方法
9
select
10
a.*
11
from
12
表 a
13
where
14
a.學生名稱 in (select top 3 學生名稱 from 表 where 所屬班級=a.所屬班級 order by 分數 desc)
15
order by
16
a.所屬班級,a.分數 desc
实例2:
1
create table 成绩
2
(
3
id int identity,
4
班级 varchar(20),
5
姓名 varchar(20),
6
分数 int
7
)
8
insert into 成绩(班级,姓名,分数)values('1','aa',89)
9
insert into 成绩(班级,姓名,分数)values('1','bb',45)
10
insert into 成绩(班级,姓名,分数)values('1','cc',65)
11
insert into 成绩(班级,姓名,分数)values('1','dd',67)
12
insert into 成绩(班级,姓名,分数)values('1','ff',23)
13
insert into 成绩(班级,姓名,分数)values('1','aeea',76)
14
insert into 成绩(班级,姓名,分数)values('1','sfdsad',26)
15
16
insert into 成绩(班级,姓名,分数)values('2','afdsf',34)
17
insert into 成绩(班级,姓名,分数)values('2','dsf',75)
18
insert into 成绩(班级,姓名,分数)values('2','fdfdg',23)
19
insert into 成绩(班级,姓名,分数)values('2','dfg',74)
20
insert into 成绩(班级,姓名,分数)values('2','sdf',23)
21
insert into 成绩(班级,姓名,分数)values('2','sdf',56)
22
insert into 成绩(班级,姓名,分数)values('2','jhj',74)
23
24
25
select * from 成绩 a where (select count(*) from 成绩 b where a.班级 = b.班级 and a.分数<= b.分数)<=3 order by 班级,分数 desc

1/**//*实例四:语句中的30,31,40,58表示不同类型的数据,如:新闻,音乐,小说等类型,查询语句的具体条件就是:
从4个不同模块中各取最新的前10条记录(不够10条则取全部数据)总共不超过40条记录来随机取4条,注意其中有可能4条都是同个类型,如果要限制每样都要有一条,则可以对限制条件做处理即可*/
2
3select id,module_id,title,msg,obj1,obj2,obj3,obj5,add_date from (
4 select * from mxt_msginfo a where (
5 select count(*) from mxt_msginfo b where a.module_id = b.module_id and a.add_date<= b.add_date )<=10 and a.module_id in (30,31,40,58)
6 order by dbms_random.value
7 ) where rownum<5