Oracle,SQLserver 分页语句

原创 2016年05月31日 12:06:41

SQL Server,Oracle 常用分页SQL

今天无聊和朋友讨论分页,发现网上好多都是错的。网上经常查到的那个Top Not in 或者Max 大部分都不实用,很多都忽略了Order和性能问题。为此上网查了查,顺带把2000和2012版本的也补上了。

先说说网上常见SQL的错误或者说局限问题

1
2
3
4
5
select top 10 *
from table1
where id not in(
    select top 开始的位置 id
    from table1)

这样的确是可以取到分页数据,但是这是默认排序的,如果要按其中一列排序呢?那order by 加在哪里呢?里外都加,显然不行,外面的Order不起作用,只能嵌套,Oh my god,编程三个Select了,这效率。

为了好用效率高,总体思路还是老老实实的用RowNumber解决,但是SQL2000没有RowNumber,其实我们可以通过临时表自增列搞定,不多说,上例子。

 

SQL 2000 用临时表解决,通过在临时表中增加自增列解决RowNumber。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 14000,@End = 14050
 
 
CREATE TABLE #employees (RowNumber INT IDENTITY(1,1),
LastName VARCHAR(100),FirstName VARCHAR(100),
EmailAddress VARCHAR(100))
 
 
INSERT INTO #employees (LastName, FirstName, EmailAddress)
SELECT LastName, FirstName, EmailAddress
FROM Employee
ORDER BY LastName, FirstName, EmailAddress
SELECT LastName, FirstName, EmailAddress
FROM #employees
WHERE RowNumber > @Start AND RowNumber <= @End
 
 
DROP TABLE #employees
 
 
GO

  


SQL 2005/2008 由于支持了Row_Number于是通过派生表的方式解决(两个嵌套)

1
2
3
4
5
6
7
8
9
10
11
12
DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 14000,@End = 14050
 
 
SELECT LastName, FirstName, EmailAddress
FROM (SELECT LastName, FirstName, EmailAddress,
ROW_NUMBER() OVER (ORDER BY LastName, FirstName, EmailAddress) AS RowNumber
FROM Employee) EmployeePage
WHERE RowNumber > @Start AND RowNumber <= @End
ORDER BY LastName, FirstName, EmailAddress
GO

  


SQL 2005/2008 或者用CTE的方式实现,和派生表一样,就是好看点,执行计划都一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 14000,@End = 14050;
 
 
WITH EmployeePage AS
(SELECT LastName, FirstName, EmailAddress,
ROW_NUMBER() OVER (ORDER BY LastName, FirstName, EmailAddress) AS RowNumber
FROM Employee)
SELECT LastName, FirstName, EmailAddress
FROM EmployeePage
WHERE RowNumber > @Start AND RowNumber <= @End
ORDER BY LastName, FirstName, EmailAddress
GO

  


SQL SERVER 2012 比较给力支持了OFFSET,于是一个Select结束战斗

1
2
3
4
5
SELECT LastName, FirstName, EmailAddress
FROM Employee
ORDER BY LastName, FirstName, EmailAddress
OFFSET 14000 ROWS
FETCH NEXT 50 ROWS ONLY;

Oracle分页(方式一)

1
2
3
4
5
select * from ( 
     select rownum as rn, source.* from ( 
          select   *  from  house 
     ) source      where rownum <= 5)     result where rn >= 1   order by(title) asc;
     

 

Oracle分页(方式二 推荐)

select * from 
                   (select a.*,rownum rn from 
                                                        (select * from house) a
                    )
                       where rn between 1 and 5   order by(ID)
 


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Oracle、DB2、SQLSERVER、MySQL、Access分页SQL语句

sqlserver分页 1.  第一种分页方法  参数:  pageSize 每页显示多少条数据  pageNumber 页数从客户端传来  totalRecouds 表中的总记录数 select c...

MySql,Sqlserver,Oracle数据的分页语句

在实际项目中分页是常见的不能再说了,这里我总结了MySql,SqlServer,Oracle这三个数据库的sql分页语句 在这三个数据库中,,个人觉得MySql的分页语句是最简单的,只用一个limit...

mysql sqlserver oracle分页语句

http://www.cnblogs.com/fanyong/p/3351350.html 与Oracle和MS SqlServer相比,mysql的分页方法简单的让人想哭。 --...

easyui中的分页实现(支持MySQL,SQLServer,Oracle)

Pagination.java package com.dxwind.common.bean; import java.sql.CallableStatement; import java.sql....

Sybase,Oracle,sqlserver中sql分页的方法汇总

Sybase 因为Sybase数据本身的局限性,要实现分页相对其它数据来说还是比较麻烦. --方法1, --这个方法从网上找来的,好处可直接传入SQL,并且对传入的SQL语句没有什么限制,合法的就行...

mysql、sqlserver、db2、oracle、hsql数据库获取数据库连接方法及分页函数

mysql、sqlserver、db2、oracle、hsql数据库获取数据库连接方法及分页函数

SQLSERVER,ORACLE,MYSQL的分页与java连接字符串总结

最近在复习sqlserver,oracle,mysql这三个数据库。综合复习的时候就总结了一下这三个数据库在java程序中的连接和分页的代码,希望拿出来和大家分享,同时也希望能帮助大家   (1)下...

SQLServer2008和Oracle10g分页存储过程

一、SQLServer2008 1.1分页存储过程: -- ============================================= -- Author:   -- Create ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)