[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建立測試環境
2create table 表(學生名稱 varchar(10),學生性別 varchar(10),年齡 int,所屬班級 varchar(10),分數 int)
3insert 表 select '張三','男',18,'三年一班',85
4union all select '張四','男',18,'三年一班',90
5union all select '張五','男',18,'三年一班',84
6union all select '張六','男',18,'三年一班',75
7union all select '李三','男',18,'三年二班',96
8union all select '李四','男',18,'三年二班',82
9union all select '李五','男',18,'三年二班',86
10union all select '李六','男',18,'三年二班',74
11union all select '王一','男',18,'四年一班',85
12union all select '王二','男',18,'四年一班',86
13union all select '王三','男',18,'四年一班',84
14union all select '王四','男',18,'四年一班',75
15go
16select * from 表
17第一中方法
18select * from 表 a
19where 分數 in(
20 select top 3 分數 from 表 where 所屬班級=a.所屬班級
21 order by 分數 desc)
22
23
1第二中方法
2select * from 表 a
3where 學生名稱 in(
4 select top 3 學生名稱 from 表 where 所屬班級=a.所屬班級
5 order by 分數 desc)
6order by 所屬班級,分數 desc
7
8第三中方法
9select
10 a.*
11from
12 表 a
13where
14 a.學生名稱 in (select top 3 學生名稱 from 表 where 所屬班級=a.所屬班級 order by 分數 desc)
15order by
16 a.所屬班級,a.分數 desc
实例2:
1create table 成绩
2(
3id int identity,
4班级 varchar(20),
5姓名 varchar(20),
6分数 int
7)
8insert into 成绩(班级,姓名,分数)values('1','aa',89)
9insert into 成绩(班级,姓名,分数)values('1','bb',45)
10insert into 成绩(班级,姓名,分数)values('1','cc',65)
11insert into 成绩(班级,姓名,分数)values('1','dd',67)
12insert into 成绩(班级,姓名,分数)values('1','ff',23)
13insert into 成绩(班级,姓名,分数)values('1','aeea',76)
14insert into 成绩(班级,姓名,分数)values('1','sfdsad',26)
15
16insert into 成绩(班级,姓名,分数)values('2','afdsf',34)
17insert into 成绩(班级,姓名,分数)values('2','dsf',75)
18insert into 成绩(班级,姓名,分数)values('2','fdfdg',23)
19insert into 成绩(班级,姓名,分数)values('2','dfg',74)
20insert into 成绩(班级,姓名,分数)values('2','sdf',23)
21insert into 成绩(班级,姓名,分数)values('2','sdf',56)
22insert into 成绩(班级,姓名,分数)values('2','jhj',74)
23
24
25select * 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