主流数据库之间对SQL:2003标准的不同实现方法比较(第四部分 查询结果集中间n行数据)

翻译 2008年08月04日 13:43:00

本文严禁在未征得本人同意的情况下以任何形式进行转载。本人只接受在邮件中的转载申请,如需转载,请发送邮件至 @126.com。  

 

带有偏移量的限制<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

目标:仅需要结果集中的n行数据,并试图忽略前面m行的数据。通常只在有ORDER BY的表达式中才有意义。

 

标准(Standard)

IDT611的非核心特性指定了window函数,其中一个为ROW_NUMBER() OVER

 

SELECT * FROM (

SELECT

    ROW_NUMBER() OVER (ORDER BY key ASC) AS rownum,

    Columns

FROM tablename

) AS foo

WHERE rownum > skip AND rownum <= (n+skip)

 

另外,如果编程环境支持,也可以使用游标(IDE121的核心特性)

DECLARE cursor-name CURSOR FOR …

OPEN cursor-name

FETCH RELATIVE number-of-rows-to-skip

CLOSE cursor-name

PostgreSQL

不支持ROW_NUMBER()。支持游标。

 

ROW_NUMBER()的替代方案:

 

SELECT columns

FROM tablename

ORDER BY key ASC

LIMIT n OFFSET skip

DB2

支持基于window函数的方法。

 

关于游标:DB2 for Linux/Unix/Windows不支持FETCH RELATIVE。请查看DB2在各编程环境下的接口是否支持SQLFetchScroll()

MS SQL Server

支持标准中描述的两种方法。

 

MSSQL 2000不支持ROW_NUMBER(),但可使用MSSQL特定的语句:

 

SELECT * FROM(

SELECT TOP n * FROM (

    SELECT TOP z columns      -- (z=n+skip)

    FROM tablename

    ORDER BY key ASC

) AS FOO ORDER BY key DESC 

) AS BAR ORDER BY key ASC

MySQL

不支持标准中讲述的方法。替代解决方案:

 

SELECT columns

FROM tablename

ORDER BY key ASC

LIMIT n OFFSET skip

 

MySQL的较早版本中,LIMIT的语法没有那么明确:

 

… LIMIT [skip,] n

Oracle

支持ROW_NUMBER()Oracle的游标不是符合标准的。

 

因为Oracle不支持子查询后通过AS命名,所以需要将标准SQL稍加修改。另一个需要修改的原因是OracleROWNUM视为关键字:

 

SELECT * FROM (

SELECT

    ROW_NUMBER() OVER (ORDER BY key ASC) AS rn,

    Columns

FROM tablename

)

WHERE rn > skip AND r <= (n+skip)

 

各种其他限制和偏移量限制经常用到:例如每次查看N行数据,以免用户收到太长的完整结果集,或者使用分页来进行查看。在这种情况下,注意不要对非唯一的列进行排序。

 

来看下例(使用了PostgreSQL)

 

SELECT * FROM person ORDER BY age ASC;

 


 

 

现在假设最终用户需要每次显示5行。结果集通过两个查询来分别进行排序,如果用PostgreSQL的语法就是:

 

SELECT * FROM person ORDER BY age ASC LIMIT 5;

 


 

SELECT * FROM person ORDER BY age ASC LIMIT 5 OFFSET 5;

 


 

注意,Marianne并未在这两个单独的结果集众显示。

 

这样的问题可以通过对结果集进行确定性排序解决,例如:

 

SELECT * FROM person ORDER BY age ASC, person_id ASC …

 

原文参考:Comparison of different SQL implementations

十分钟轻松搞定两个不同数据库之间的数据交换

JadePool为广大Java工作者提供了许多简洁实用的方法,如果需要实现不同数据库之间的数据交换,使用JadePool十分方便。这是十分有价值的实践活动,比如,在网站的数据管理中,我们需要将远程数据...
  • wj800
  • wj800
  • 2013年03月04日 10:42
  • 1546

实现两个数据库之间的数据同步

不同服务器数据库之间的数据操作   --创建链接服务器  exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或i...
  • m15188153014
  • m15188153014
  • 2015年10月31日 17:11
  • 4952

SQL中查询前几条或者中间某几行数据limit

SELECT * FROM table  LIMIT [offset,] rows | rows OFFSET offset 使用查询语句的时候,要返回前几条或者中间某几行数据,用Llimit   ...
  • hzp666
  • hzp666
  • 2017年03月10日 13:28
  • 2320

Sql操作之二:不同数据库中表数据迁移

一:在同一服务器 insert  into   数据库name1.dbo.table_name2(字段名称1,字段名称2,……) select  字段名称1,字段名称2,…… from ...
  • llso9001
  • llso9001
  • 2016年02月02日 13:57
  • 2784

SqlServer查询介于两个值之间的数据记录

sql的between與查詢日期範圍的问题,今天将access转sql时发现的问题。 資料 Customer Id Name Registe...
  • JJYMMJ
  • JJYMMJ
  • 2013年07月03日 15:01
  • 2911

Oracle SQL分析函数lag、lead解决相邻记录比较问题

Oracle SQL分析函数lag、lead解决相邻记录比较问题
  • Seandba
  • Seandba
  • 2017年05月21日 22:30
  • 828

不同服务器数据库之间的数据操作,数据同步

不同数据库数据同步   INSERT INTO TB_BASE_USER_ORGANISEUNIT([GH]       ,[ORGANISEUNITID]       ,[U_ORDER]...
  • yuzhilin1
  • yuzhilin1
  • 2016年04月14日 23:39
  • 899

主流内存数据库简要比较

由本人搜集资料整理而成,如需转载请注明出处:http://blog.csdn.net/nanfeiyannan/article/details/9003009(谢谢) 主要内存数据库对比   ...
  • nanfeiyannan
  • nanfeiyannan
  • 2013年05月31日 23:15
  • 14969

主流nosql数据库对比

转自:http://asyty.iteye.com/blog/1202106 主流nosql数据库对比 博客分类:  NOSQL nosql数据库对比  目前开源的NOSQL数据...
  • suejl
  • suejl
  • 2016年02月23日 10:52
  • 829

SQL不同服务器数据库之间的数据操作整理(完整版)

因为是转载文章 在此标明出处,以前有文章是转的没标明的请谅解,因为有些已经无法找到出处,或者与其它原因。 如有冒犯请联系本人,或删除,或标明出处。 因为好的文章,以前只想收藏,但连接有时候...
  • sat472291519
  • sat472291519
  • 2014年10月08日 13:39
  • 1907
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:主流数据库之间对SQL:2003标准的不同实现方法比较(第四部分 查询结果集中间n行数据)
举报原因:
原因补充:

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