2009年2月24日星期二

用一句SQL取出第 m 条到第 n 条记录的方法

参考各类资料:

一、MS SQL SERVER 版

从Table 表中取出第 m 条到第 n 条的记录:(Not In 版本)

SELECT TOP n-m+1 *
FROM Table
WHERE (id NOT IN (SELECT TOP m-1 id FROM Table ))


--从TABLE表中取出第m到n条记录 (Exists版本)

SELECT TOP n-m+1 * FROM TABLE AS a WHERE Not Exists
(Select * From (Select Top m-1 * From TABLE order by id) b Where b.id=a.id )
Order by id


--m为上标,n为下标,例如取出第8到12条记录,m=8,n=12,Table为表名

Select Top n-m+1 * From Table
Where Id>(Select Max(Id) From
(Select Top m-1 Id From Table Order By Id Asc) Temp)
Order By Id Asc

Oracle 版本:

Oracle中的实现,取得第M到N条记录:
SELECT * FROM (
SELECT * , ROWNUM AS CON FROM ( SELECT * FROM [TABLE] ORDER BY [ORDER] )
WHERE ROWNUM <= N )
WHERE CON >= M;

ref link:http://www.cnblogs.com/athrun/archive/2007/03/02/661213.html


其他相关:

1.直接取得数据库中的分页记录

前提是表中必须有主键

取得第M条记录之后的N条记录:
SELECT TOP N *
FROM [TABLE]
WHERE (ID NOT IN
(SELECT TOP M id
FROM [TABLE]
ORDER BY [ORDER]))
ORDER BY [ORDER]

2.查询表中连续的某几条记录
不要传任何列的条件参数,查询表中连续的某几条记录
如:表A,id列为主键
id name sex age
-------------------------
1 luoyi male 21
2 yaya female 20
3 lili female 22
4 wuyong male 25
.......................

这个表的记录还有很多,如果我想取第二、第三条记录,在oracle和mssqlserver中SQL代码分别为:

一、Oracle
在oracle中不能用top关键字,而用rownum,有两种方法可以实现
1.(select * from A where rownum <= 4) minus (select * from A where rownum <= 1)
这样就得到了二、三两条记录了。minus 关键字的意思是求两个结果集的差集,在数学中有这个概念,比如说两个集合可以合并、公有、差集.
2. select * from (select * from A where rownum <>  这句代码也可以实。主要运用了not in运算符

二、ms sql server
在server中没有minus,只能用类似于oracle的第二种方法
select * from (select top 3 * from A) as b where b.id not in(select top 1 id from A)
三、绘制出来的结果为:
id name sex age
--------------------------------
2 yaya female 20
3 lili female 22


3.查询数据库中的N条记录,然后,对这N条记录排序

正确答案1:
select top 10 * from TableName where id in(select top 10 id from TableName order by id) order by createtime
这条语句,就可以找出表中的前10条的记录,然后以createtime时间排序
要求是表中需要有一个主键

答案2
没有主键也可以
SELECT *
FROM (SELECT TOP 10 *
FROM titles) mm
ORDER BY pubdate DESC

4.随机取出若干条记录的SQL语句

Sql server:


select top 20 * from 表 order by newid()

Access:

SELECT top 20 * FROM 表 ORDER BY Rnd(id)

Rnd(id) 其中的id是自动编号字段,可以利用其他任何数值来完成

比如用姓名字段(UserName)

SELECT top 20 * FROM 表 ORDER BY Rnd(len(UserName))

MySql:

Select * From 表 Order By rand() Limit 20

没有评论: