zoukankan      html  css  js  c++  java
  • oracle中使用子查询为何取到大于自然数1 rownum 浅度解析

    Oracle 没有提供TOP N 语句,若希望按特定条件查询前N 条记录,可以使用伪列ROWNUM。
    ROWNUM 是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列(注意:先要
    有结果集)。
    rownum 的值是oracle 顺序分配的从查询返回的行的编号,返回的第一行分配的是1,第二
    行是2,依此类推。

    查询表中第n(n>1)条记录,使用rownum=n 作为条件。
    SQL> SELECT rownum,id,name FROM student WHERE rownum =2;

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

    可以使用子查询解决:
    SQL> SELECT * FROM (SELECT rownum no ,id,name FROM student) WHERE no=2;
    说明:
    子查询中的rownum 必须要有别名,否则还是查不出记录。因为rownum 不是某个表的列,
    如果不起别名,就无法知道rownum 是子查询的列还是主查询的列。

    个人觉得,使用子查询主要是使rownum像表中的真正列一样 出现在from后面。这样rownum的值不再变化,当然可以取到任何值了,如果不放在子查询里面,你想取到的rownum伪列的值是不断变化的。

  • 相关阅读:
    使用MingGW-w64 Build Script 3.6.7搭建ffmpeg编译环境
    ffmpeg精简编译
    CListCtrl死锁的问题
    VC程序禁用提示框
    rtmp协议分析
    [置顶] zabbix发送告警
    [置顶] 个人微信号发送zabbix告警信息
    [置顶] 一个简单好用的zabbix告警信息发送工具
    [置顶] zabbix告警信息-lykchat信息发送系统
    模拟登陆web微信的流程和参数细节
  • 原文地址:https://www.cnblogs.com/zwl24/p/2356789.html
Copyright © 2011-2022 走看看