`
letitbe
  • 浏览: 237582 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

取最新的几条记录(及rownum的解释)

阅读更多
select rownum,c1 from t1 where rownum > 10没有记录,

因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。或者可以这样理解:

ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。

select rownum,c1 from t1 where rownum != 10 为何是返回前9条数据呢?
为什么 rownum >1 时查不到一条记录,而 rownum >0 或 rownum >=1 却总显示所以的记录
任何时候想把 rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的,少了rownum=1 就像空中楼阁一般不能存在,所以你的 rownum 条件要包含到 1

但如果就是想要用 rownum > 10 这种条件的话话就要用嵌套语句,把 rownum 先生成,然后对他进行查询。
select *
from (selet rownum as rn,t1.* from a where ...)
where rn >10

一般代码中对结果集进行分页就是这么干的。

另外:rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件就不会有 rownum那些情况发生。

详见http://hi.baidu.com/jztchina/blog/item/4cca34971258fe6954fb96d6.html

Oracle在检索的时候,会首先把数据都检索出来,然后在排序段中进行排序。假如你有一个SQL语句如下所示
SELECT
        EMP_NO
FROM
        EMP
WHERE
        ROWNUM 
< 10
ORDER BY
        EMP_NO

        在检索的时候,会首先把数据检索出来,也就是把EMP表数据都检索出来,然后再Order by排序操作。因为ROWNUM 数据是在排序前就检索出来的了,所以不能利用ROWNUM来取得排序后的前10条操作。那么应该如何操作呢。其实很简单,利用子查询,先排序,再取ROWNUM。如下所示

SELECT
        EMP_NO
FROM
        (
        
SELECT 
                EMP_NO
        
FROM
                EMP
        
ORDER BY
                EMP_NO
        )
WHERE
        ROWNUM 
< 10
分享到:
评论
1 楼 LD_21 2011-10-10  

相关推荐

    ROWNUM的使用技巧

    我们可以使用 ROWNUM 实现 Top N 结果输出,例如如果我们希望取输出结果的前面几条数据,可以使用以下 SQL 语句: ```sql select * from t_test4 where rownum ; ``` 这将返回结果中的前 5 条记录。 分页查询 ...

    对于 Oracle 的 rownum 问题

    如果你用&gt;,&gt;=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。 有了以上从不同方面建立起来的...

    查询前几条记录

    "查询前几条记录"这个主题聚焦于如何从数据库表中提取出最早添加或者最相关的若干条数据。这在很多场景下都非常有用,例如展示最新的新闻、加载用户最近的操作记录等。 在SQL语言中,有一个非常常见的方法来实现这...

    关于oracle的rownum

    如果你使用 &gt;, &gt;=, =, between...and 这些条件,因为从缓冲区或数据文件中得到的第一条记录的 ROWNUM 为 1,则被删除,接着取下条,可是它的 ROWNUM 还是 1,又被删除,依次类推,便没有了数据。 例如,使用 ...

    在oracle中灵活使用Rownum和rowId

    - **限制查询结果数量**:比如只需要查询前几条记录。 - **分页查询**:例如,实现每页显示固定数量的记录。 ##### 3. ROWNUM 的使用示例 假设我们有一个名为 `SALE` 的表,包含月份(`MONTH`)和销售额(`SELL`)...

    从数据库中读取指定行数记录

    这种方法通过排除前几条记录的方式来获取所需的记录。例如,从第三条记录开始获取数据可以这样实现: ```sql SELECT * FROM table_name WHERE id_field NOT IN (SELECT TOP 3 id_field FROM table_name); ``` 这里的...

    Oracle结合Mybatis实现取表TOP 10条数据

    总结起来,Oracle结合Mybatis实现取表TOP 10条数据的关键在于理解并正确使用`ROWNUM`,以及在Mybatis中适当地处理查询条件和序列值。通过子查询和设置Mybatis的缓存属性,我们可以有效地解决这些问题,从而在Oracle...

    各个数据库分页技术关键代码

    在这个例子中,`M`表示从第几条记录开始,`N`表示要取多少条记录。例如,如果我们想从`Sys_option`表中从第10条记录开始获取20条记录,可以写成: ```sql SELECT * FROM ( SELECT TOP 20 * FROM ( SELECT TOP ...

    Oracle里抽取随机数的多种方法

    如果 tmp_1 记录比较多(10 万条以上),我们也可以找一个约大于两百行的表(假如是 tmp_3)来生成 tmp_2: create table tmp_2 as select trunc(dbms_random.value(1,5000)) as id from tmp_3 where rownum; 最后...

    sqlserver中重复数据值只取一条的sql语句

    在SQL Server中,有时我们需要处理含有重复数据的表,例如,我们可能希望只保留每组重复数据中的第一条记录。在给定的标题和描述中,提到了如何编写一个SQL语句来实现这一目标。以下是对这个话题的详细解释: 首先...

    SQL常见面试问题集锦

    - 当需要根据某个字段进行排序后取前几条记录时,不能直接将 ORDER BY 放在带有 ROWNUM 的查询语句中,因为 ROWNUM 的计算是在 ORDER BY 之后进行的。 - 正确的做法是先对数据进行排序,然后使用子查询将排序后的...

    不同数据库中分页的代码实现

    - `@StartPos`: 表示从第几条记录开始。 - `@PageSize`: 每页显示多少条记录。 例如: ```sql SELECT * FROM table LIMIT 5, 10; -- 获取第6条到第15条记录 SELECT * FROM table LIMIT 5; -- 获取前5条记录 SELECT...

    oracle分页查询

    如果想取得排序后的前几条记录,需要使用子查询来实现。 Hibernate 实现分页查询 Hibernate 也可以实现分页查询,例如: ```java Query q = session.createQuery("from Cat as c"); q.setFirstResult(20000); q....

    sql分页分析

    其中,`n`表示每页显示的记录数,`m`是偏移量,即从第几条记录开始取数据。例如,如果每页显示10条记录,当前页为第二页,则`m`应为10,即跳过前10条记录,从第11条开始取接下来的10条记录。 ##### 方法二:TOP 和 ...

    几种数据库的数据分页

    如果只想指定查询多少条记录而不指定起始位置,则默认从第一行开始: ```sql SELECT * FROM 表名 LIMIT 10; ``` 等价于: ```sql SELECT * FROM 表名 LIMIT 0, 10; ``` 如果只需要一个参数,表示从第0行开始: ...

    通用存储过程高效分页

    例如,第一页可能包含前10条记录,第二页包含接下来的10条记录,以此类推。 通用存储过程的优点在于它可以被多次重用,适用于不同的表和不同的分页需求。在创建这样一个存储过程时,我们需要考虑以下几个核心要素:...

    oracle 取某个时间段的数据(每周几的上午几点到几点)

    此外,描述中还提到了在Oracle中获取某条记录的最新版本的几种方法: 1. **第一种方式**:使用`max`函数结合子查询,找到特定条件下(如`customer_code`)的最新`INVALID_TIME`。 2. **第二种方式**:先对数据按`...

    java分页 find

    例如,`SELECT * FROM table LIMIT start, limit_size`,其中`start`表示从第几条记录开始,`limit_size`表示每页显示的记录数。 - `OFFSET` 与 `LIMIT` 结合:`OFFSET` 可以用来设置跳过的记录数,但MySQL不直接...

    jsp 分页网上收集的

    3. **计算偏移量**:即从哪一条记录开始显示,这取决于当前页数和每页显示的记录数。 4. **执行SQL查询**:使用偏移量和每页显示的记录数来构建SQL查询,获取当前页的数据。 5. **封装结果**:将查询结果封装到一...

Global site tag (gtag.js) - Google Analytics