引用
oracle中如何实现类似MSSQL中Select top N语句,以实现从结果中抽出相应的数据
oracle top n(源:http://huibin.iteye.com/blog/419780)
1.在ORACLE中实现SELECT TOP N
由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询。
简单地说,实现方法如下所示:
SELECT 列名1...列名n FROM
(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM <= N(抽出记录数)
ORDER BY ROWNUM ASC
下面举个例子简单说明一下。
顾客表customer(id,name)有如下数据:
ID NAME
01 first
02 Second
03 third
04 forth
05 fifth
06 sixth
07 seventh
08 eighth
09 ninth
10 tenth
11 last
则按NAME的字母顺抽出前三个顾客的SQL语句如下所示:
SELECT * FROM
(SELECT * FROM CUSTOMER ORDER BY NAME)
WHERE ROWNUM <= 3
ORDER BY ROWNUM ASC
输出结果为:
ID NAME
08 eighth
05 fifth
01 first
2.在TOP N纪录中抽出第M(M <= N)条记录
在得到了TOP N的数据之后,为了抽出这N条记录中的第M条记录,我们可以考虑从ROWNUM着手。我们知道,ROWNUM是记录表中数据编号的一个隐藏子段,所以可以在得到TOP N条记录的时候同时抽出记录的ROWNUM,然后再从这N条记录中抽取记录编号为M的记录,即使我们希望得到的结果。
从上面的分析可以很容易得到下面的SQL语句。
引用
SELECT 列名1...列名n FROM
(
SELECT ROWNUM RECNO, 列名1...列名nFROM
(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM <= N(抽出记录数)
ORDER BY ROWNUM ASC
)
WHERE RECNO = M(M <= N)
同样以上表的数据为基础,那么得到以NAME的字母顺排序的第二个顾客的信息的SQL语句应该这样写:
SELECT ID, NAME FROM
(
SELECT ROWNUM RECNO, ID, NAME FROM
(SELECT * FROM CUSTOMER ORDER BY NAME)
WHERE ROWNUM <= 3
ORDER BY ROWNUM ASC )
WHERE RECNO = 2
结果则为:
ID NAME
05 fifth
3.抽出按某种方式排序的记录集中的第N条记录
在2的说明中,当M = N的时候,即为我们的标题讲的结果。实际上,2的做法在里面N>M的部分的数据是基本上不会用到的,我们仅仅是为了说明方便而采用。
如上所述,则SQL语句应为:
引用
SELECT 列名1...列名n FROM
(
SELECT ROWNUM RECNO, 列名1...列名nFROM
(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM <= N(抽出记录数)
ORDER BY ROWNUM ASC
)
WHERE RECNO = N
那么,2中的例子的SQL语句则为:
SELECT ID, NAME FROM
(
SELECT ROWNUM RECNO, ID, NAME FROM
(SELECT * FROM CUSTOMER ORDER BY NAME)
WHERE ROWNUM <= 2
ORDER BY ROWNUM ASC
)
WHERE RECNO = 2
结果为:
ID NAME
05 fifth
4.抽出按某种方式排序的记录集中的第M条记录开始的X条记录
3里所讲得仅仅是抽取一条记录的情况,当我们需要抽取多条记录的时候,此时在2中的N的取值应该是在N >= (M + X - 1)这个范围内,当让最经济的取值就是取等好的时候了的时候了。当然最后的抽取条件也不是RECNO = N了,应该是RECNO BETWEEN M AND (M + X - 1)了,所以随之而来的SQL语句则为:
引用
SELECT 列名1...列名n FROM
(
SELECT ROWNUM RECNO, 列名1...列名nFROM
(
SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM <= N (N >= (M + X - 1))
ORDER BY ROWNUM ASC
)
WHERE RECNO BETWEEN M AND (M + X - 1)
同样以上面的数据为例,则抽取NAME的字母顺的第2条记录开始的3条记录的SQL语句为:
SELECT ID, NAME FROM
(
SELECT ROWNUM RECNO, ID, NAME FROM
(SELECT * FROM CUSTOMER ORDER BY NAME)
WHERE ROWNUM <= (2 + 3 - 1)
ORDER BY ROWNUM ASC
)
WHERE RECNO BETWEEN 2 AND (2 + 3 - 1)
结果如下:
ID NAME
05 fifth
01 first
04 forth
以此为基础,再扩展的话,做成存储过程,将开始记录数以及抽取记录数为参数,就可以轻松实现分页抽取数据。
分享到:
相关推荐
MSSQL中实现递归查询的方式不同于ORACLE。在MSSQL中,我们可以利用公用表表达式(Common Table Expressions,CTEs)和递归的CTE来完成类似的操作。递归CTE实际上是一个可以引用自身的CTE。在定义CTE时,使用WITH...
综上所述,这个"oracle和mssql分页存储过程-均通用"的压缩包文件提供了一个跨平台的解决方案,帮助开发者在Oracle和MSSQL数据库中轻松实现高效的分页查询,同时提高了代码的可维护性和复用性。在实际应用中,应结合...
在 MySQL 中实现分页查询通常有两种方法:`LIMIT` 和 `NOT IN` 方法。 1. **LIMIT 方法**: ```sql SELECT * FROM book LIMIT M, N; ``` - **解释**:此语句从第 M+1 行开始返回 N 条记录。 - **示例**:假设...
下面,我们将深入探讨如何使用JDBC实现Oracle、MySQL和MSSQL数据库的连接。 ### JDBC简介 JDBC是一种用于执行SQL语句的Java API,它可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。...
查询语句是数据库操作的基础,Oracle提供了多种查询方式,包括简单的SELECT语句、联接查询(INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN)、子查询、聚合函数(如COUNT, SUM, AVG, MAX, MIN)以及分组和排序...
### 利用MSSQL的OPENDATASOURCE把文本文件中的数据插入、更新到ORACLE 在跨数据库操作中,经常会遇到需要将一个数据库的数据导入到另一个数据库的情况。例如,将文本文件中的数据导入到Oracle数据库中进行处理。...
在MSSQL中,我们可以使用SQL Server Management Studio (SSMS) 或 Transact-SQL (T-SQL) 查询语句来获取表的结构信息。以下是一些常用的T-SQL查询: 1. **查询表名和字段名**: ```sql SELECT COLUMN_NAME, DATA_...
- 这条语句将从 Oracle 的 `poweronhr` 用户下的 `department` 表中检索所有数据。 4. **MSDTC(Microsoft Distributed Transaction Coordinator)设置** - 要实现跨数据库的分布式事务处理,MSDTC 需要正确配置...
在IT领域,Java Database Connectivity(JDBC)是Java平台中用于与关系数据库进行交互的一组标准API。JDBC提供了一种标准的接口,使得Java程序员能够以统一的方式处理不同的数据库系统,包括MSSQL(Microsoft SQL ...
例如,可以创建抽象方法,然后在各个数据库特定的子类中实现这些方法,以达到更高的代码复用和解耦。 总之,这个压缩包中的`Database`类库为PHP开发者提供了一个便利的工具,帮助他们高效地与MySQL、MSSQL、Oracle...
- **执行查询**:在Oracle环境中尝试执行查询语句,如`SELECT * FROM 表名@linkname`。 #### 四、常见问题与解决方案 - **时间类型转换问题**:如果Oracle中的时间类型需要插入到SQL Server的`datetime`字段中,...
在本教程中,我们将一步步地指导您如何使用 Oracle 的异构服务 ODBC agent 连接 SQL Server 数据库。 Step 1: 定义 SQL Server 的数据源名称(DSN) 首先,我们需要在 Windows 中定义一个系统 DSN(Data Source ...
pymssql作为专门针对SQL Server的接口,允许开发者在Python环境中执行SQL语句,进行数据的读写操作。而pyodbc则是一个更通用的数据库连接库,除了SQL Server,还可以用于Oracle、MySQL、Access和Excel等。 **连接...
为了实现从第M条记录开始取N条记录的效果,可以使用嵌套的`SELECT`语句。具体如下: ```sql SELECT * FROM ( SELECT Top N * FROM ( SELECT Top (M + N – 1) * FROM 表名称 ORDER BY 主键 DESC ) t1 ) ...
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else ...
例如,`SELECT TOP n * FROM table` 可以获取表中的前n行。 - 为了实现分页,可以结合`TOP`和`WHERE`子句以及`ORDER BY`。如,查询第2页的记录(假设每页有5个记录),可以使用`SELECT TOP 5 * FROM table WHERE id...
- 查询语言:SELECT语句,JOIN操作,子查询,聚合函数。 - 安全性:用户权限,角色管理,访问控制。 - 高级主题:存储过程,触发器,游标,事务和回滚,备份与恢复,性能调优。 通过这个压缩包中的视频,学习者可以...
`MS_SQL_SELECT.html`文件可能包含关于MSSQL SELECT语句的详细比较,而`Comparison of different SQL implementations.html`可能对比了不同SQL实现的特性。 标签中的“tsql”代表Transact-SQL,这是MSSQL的SQL方言...