[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