因为两种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保存的更多相关文章

  1. 1-监控界面sql保存

    1, BufferSize_machine 1), template 主要用来监控buffersize的状态的 name: 模块名字, 用于后续调取使用, label: 模块显示名字, 在页面显示的 ...

  2. sql 保存,性能高

    INSERT INTO TABLE( Id, Name) VALUES ( 4, 'A'), ( 5, 'P' ),( 6, 'U') ; INSERT INTO TABLE( Id, Name) S ...

  3. SQL保存XML报错 “XML 分析: 行 1,字符 47,非法的 xml 字符”

    例如: <?xml version="1.0" encoding="utf-8" standalone="yes"?> < ...

  4. oracle数据库如何保存SQL语句?

    比如:通过系统web页面自动生成了sql语句,insert into temp(select '1,2,3',to_date(sysdate,'yyyy--mm-dd hh24:mi:ss') fro ...

  5. Spring mybatis源码篇章-NodeHandler实现类具体解析保存Dynamic sql节点信息

    前言:通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-XMLLanguageDriver解析sql包装为SqlSource SqlNode接口类 publi ...

  6. mysql 自动备份导出到sql

    创建一个sh文件 vi mysql_auto.sh写入如下代码 导出单个数据库 /www/wdlinux/mysql/bin/mysqldump -uroot -p123456 database &g ...

  7. OAF_开发系列03_实现OAF如何在保存前判断数据是否存在变更(案例)

    2014-06-26 Created By BaoXinjian

  8. PL/SQL使用技巧

    1.如何在PL/SQL developer中查看所连接的oracle的版本答:select * from v$version;或者在pl/sql developer 里查看[Reports]——> ...

  9. Oracle SQL*plus常用的命令和函数

    常用命令: 连接sqlplus命令行下运行cmd进入,如以sys模式登陆,命令如下:(1).sqlplus "sys/zhb126 as sysdba" (2).sqlplus/n ...

随机推荐

  1. 【优化技巧】指数移动平均EMA的原理

    前言 在深度学习中,经常会使用EMA(exponential moving average)方法对模型的参数做平滑或者平均,以求提高测试指标,增加模型鲁棒性. 参考 1. [优化技巧]指数移动平均(E ...

  2. [LeetCode] 270. Closest Binary Search Tree Value 最近的二叉搜索树的值

    Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...

  3. 修改服务器时间以后 cookie无法保存

    修改了服务器时间以后发现,cookie无法保存.通过查看异步请求的响应头信息  Date是之前修改的信息,并不是当前的时间. header('Date: Mon, 17 Mar 2015 05:34: ...

  4. (转)JVM原理讲解和调优

    背景:jvm实际调优在面试时候经常被问到,所以有必要认真总结一番. 转自:JVM原理讲解和调优 四.JVM内存调优 首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存 ...

  5. python sys模块(12)

    在python sys模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数!关于sys模块在官网也有详细的介绍:python sys模块官方介绍. 一.sys模块简介 sys.arg ...

  6. lay-verify

    lay-verify:是表单验证的关键字 required (必填项) phone(手机号) email(邮箱) url(网址) number(数字) date(日期) identity(身份证) 自 ...

  7. 开发板与pc之间文件传输:kermit and lrzsz

    imx6开发板与pc机之间通过串口传输文件步骤: 1. 安装好kermit并可以使用 2. 交叉编译lrzsz开源软件并把可执行程序lrz lsz拷贝到开发板 2.1 下载并解压lrzsz-0.12. ...

  8. gentoo emerge简单用法

    包管理工具 包的命名 gentoo中每个包名包含两部分,组名与包名,如:dev-db/redis,dev-db是组名,redis是包名或者称库名. 安装搜索时需要指定包的名称,一般不需要输入组名, 但 ...

  9. OpenJDK自动安装脚本 InstallOpenJDK.vbs

    Oracle JDK 要收费了,Open JDK没有安装包,只有Zip,写了个安装脚本 InstallOpenJDK.vbs Rem ********************************* ...

  10. linux centos7开机自动启动程序实现

    1存放脚本位置 /etc/init.d/ServerManagerCLI.sh 该脚本是自己新建的内容参看2 增加执行权限 chmod +x /etc/rc.d/init.d/ServerManage ...