最近正忙着从SQL Server 向Oracle 转型,遇到的第一个常见问题就是 查询前n 行数据的问题。
Oracle 中没有像SQL Server 中的TOP N 那样的关键字和用法,万幸的是 Oracle 中有一个被称为 伪行号列的 rownum 帮了我的大忙。
查询前n 行数据
SELECT * FROM EXPTABLE WHERE ROWNUM<=N;
变得如此简单。
那么 查询 从m 行到n行 的 记录 是不是 相想象的那样呢?
SELECT * FROM EXPTABLE WHERE ROWNUM >=M AND ROWNUM<=N;
使用上面的方法居然一条数据也没查询到。实在是失望之极。
正处失望之际,突然想到的 MINUS 集合操作符, 使用下面的方法:
SELECT * FROM EXPTABLE WHERE ROWNUM<=N
MINUS
SELECT * FROM EXPTABLE WHERE ROWNUM<=M;
果然得到了预期效果。
原来在SQL Server 中、 没有 MINUS 集合操作符 的情况下 我曾用过 添加 identity 列的方式
实现了 <查询 从m 行到n行 的 记录 > 的 目的 。先如今是不是也可以套用一下:
SELECT field1,field2,..., fieldn FROM
(SELECT ROWNUM RN ,field1,field2,..., fieldn FROM EXPTABLE WHERE ROWNUM<=N) T
WHERE T.RN>M
同样得到了预期效果
原来实现方法多多!!