因为两种Oracle数据库中对于结果行号的处理异同造成的。

在MSSQLServer中,可以使用top和ROW_NUMBER()方法的结合来实现,一般写法比较简单,而Oracle则有很大的不同。

只能通过ROWNUM来实现,我们这里主要说明一下,如何使用ROWNUM来实现一些常用的Oracle分页和排序查询,有关ROWNUM的概念,随便搜一下,有很多详细的解释都很清晰,就不赘述了。

1.查询前10条记录

 SELECT * FROM TestTable WHERE ROWNUM<=10

2.查询第11到第20条记录

SELECT * FROM
	 ( 
			 SELECT TestTable.*, 
			ROWNUM ro FROM TestTable
			WHERE ROWNUM<=20
	)
WHEREro>10

3.Oracle分页和排序:按照name字段升序排列后的前10条记录

SELECT * FROM
(SELECT * FROM TestTable ORDER BY name ASC)
WHERE ROWNUM<=10

4.按照name字段升序排列后的第11到第20条记录

SELECT  * FROM 
( 
		SELECT tt.*,ROWNUM ro FROM
		( SELECT * FROM TestTable ORDER BY name ASC) tt
		WHERE ROWNUM<=20
)
WHERE  ro>10

例:

SELECT rownum,ss.* FROM
(SELECT s.*,ROWNUM ro FROM
(SELECT * FROM spr_student ORDER BY s_id ASC)s
WHERE ROWNUM<=15)ss
WHEREro>10

select * fromspr_student;

以上此条语句可能是在查询排序和Oracle分页的时候最常用到的语句,其中没有添加条件,因为不影响语句的结构。虽然性能有所影响,但可能只是最内层的查询可能会有多查数据的可能,但对于外层的再排序再选择来说,应该影响很小。



 mysql:  select * from table order by column1 desc limit 5;
 oracle: select top 5 * from table order by column1 desc;
	mssql:   select top 5 * from table order by column1 desc
	

  

 

今天整理下Oracle分页查询,希望能够帮到其他小伙伴。

Oracle分分页查询格式:

SELECT * FROM  
	(  
			SELECT A.*, ROWNUM RN  
			FROM (SELECT * FROM TABLE_NAME) A  
			WHERE ROWNUM <= 40  
	)  
WHERE RN >= 21  

其中最内层的查询SELECT * FROM TABLE_NAME 表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

上面给出的这个Oracle分分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。

在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。

选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。查询语句如下:

SELECT * FROM  
	(  
			SELECT A.*, ROWNUM RN  
			FROM (SELECT * FROM TABLE_NAME) A  
	)  
WHERE RN BETWEEN 21 AND 40  
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

这是由于CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。
对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。
因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。

上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

完整的sql语句:
SELECT * FROM  
	(  
			SELECT A.*, ROWNUM RN  
			FROM (SELECT * FROM tablename) A  
			WHERE ROWNUM <2*5+1  
	)  
WHERE RN >(2-1)*5 ;
其中pageNum=2,pageSize=5,tablename为表名

  

一些SQL保存_分页 ------------------------- A little Progress a day makes you a big success... ----------------------------