`
364434006
  • 浏览: 591873 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle关键字rownum的使用

 
阅读更多

Rownum是oracle提供的一个伪列,我们用的比较多的地方是在做分页的时候。

如果对rownum使用不当,往往会出现一些比较抓狂的现象。

假如有表结构如下:

tid  tname ttype

5    T1    Q1
4    T4    Q1
3    T3    Q7
2    T2    Q2
1    T1    Q6
6    T6    Q1
7    T7    Q3
8    T8    Q3
9    T9    Q4
10    T10    Q5

 

执行语句:SELECT rownum,t.* FROM t_test t ORDER BY t.tid;

预期的结果应该是:

rownum tid tname ttype
1    1    T1    Q6
2    2    T2    Q2
3    3    T3    Q7
4    4    T4    Q1
5    5    T1    Q1
6    6    T6    Q1
7    7    T7    Q3
8    8    T8    Q3
9    9    T9    Q4
10    10    T10    Q5

而真实结果确实:

rownum tid tname ttype

5    1    T1    Q6
4    2    T2    Q2
3    3    T3    Q7
2    4    T4    Q1
1    5    T1    Q1
6    6    T6    Q1
7    7    T7    Q3
8    8    T8    Q3
9    9    T9    Q4
10    10    T10    Q5

 

产生的结果并没有按我们预期的先排序再生成rownum值,生成的rownum值是按照我们添加数据时的顺序。

 

产生这种结果可以有两种方式解决:

1、order by 字段建立主键约束

2、将rownum提到外层使用,语句:

SELECT ROWNUM,tt.* FROM (
SELECT * FROM t_test t
)tt

 

采用这两种方式之一,输出的结果就同我们预想的一样。

 

但是,在使用的过程中发现了另外一个问题,在对分组字句使用rownum时显示乱序。

sql语句:
SELECT * FROM (
SELECT MAX(t.tid),MAX(t.tname),t.ttype FROM t_test t GROUP BY t.ttype
) tt WHERE ROWNUM<3

执行结果并没有如预期显示子查询结果的前两行数据。

 

解决方法有两个:

1、分组内部先排序
SELECT * FROM (
SELECT MAX(t.tid),MAX(t.tname),t.ttype FROM t_test t GROUP BY t.ttype ORDER BY MAX(t.tid)
) tt WHERE ROWNUM<3

2、分组外多包层查询
SELECT ttt.* FROM (
SELECT ROWNUM row_num,tt.* FROM (
SELECT MAX(t.tid),MAX(t.tname),t.ttype FROM t_test t GROUP BY t.ttype
) tt
) ttt WHERE ROWNUM<3

 

分享到:
评论

相关推荐

    oracle中利用关键字rownum查询前20名员工信息及rownum用法

    注意:对 rownum(伪列) 只能使用 &lt; 或 &lt;=, 而用 =, &gt;, &gt;= 都将不能返回任何数据  例:查询工资前20名的员工姓名,工资 ,工资由高到低 Select rownum,first_name,salary from (Select first_name, salary ...

    mysql类似oracle rownum写法实例详解

    在 Oracle 中,如果你想要获取表中的第一条记录,你可以使用如下的 `ROWNUM` 写法: ```sql SELECT * FROM t WHERE ROWNUM = 1 ORDER BY id; ``` 而在 MySQL 中,要达到相同的效果,你需要使用 `LIMIT` 关键字配合...

    oracle 使用rownum的三种分页方式

    在Oracle数据库中,`ROWNUM`是一个特殊的关键字,它为每一行返回一个唯一的数字,表示该行在查询结果集中的位置。`ROWNUM`在处理分页查询时非常有用,因为它允许我们按指定的顺序获取结果集的一部分。以下是使用`...

    asp.net使用oracle分页存储过程查询数据

    rownum是Oracle关键字。 存储是来自http://blog.csdn.net/pharaohsprince/archive/2006/04/12/660800.aspx。 对存储过程做了简单的修改方法程序的调用。 效率不是很高,如有高人写出很厉害的分页存储过程,希望您...

    java笔记\Oracle里sql不能用limit的处理

    在Oracle中,我们可以使用RowNum函数来实现分页查询。RowNum函数可以返回当前记录的行号,从1开始。我们可以使用RowNum函数来限制查询的记录数。 例如,以下SQL语句可以查询表t_table_name的前10条记录: ```sql ...

    Oracle分页(limit方式的运用)

    其中一种常用的方法就是使用`LIMIT`子句(尽管Oracle数据库本身不直接支持标准SQL中的`LIMIT`关键字,但可以通过其他方式模拟其功能)。本文将详细介绍如何在Oracle中实现类似`LIMIT`的关键字来完成分页查询。 ####...

    达梦和oracle的差异说明

    通过以上分析可以看出,尽管达梦数据库旨在兼容Oracle的部分功能,但在实际应用中仍需注意两者之间的差异,特别是在字段名处理、数据类型使用、语法关键字等方面。了解这些差异有助于更好地利用这两种数据库系统,并...

    oracle排序

    在 Oracle 中,可以使用 NULLS FIRST 关键字对数据进行排序,将 NULL 值放在最前。例如,以下语句将对 perexl 表中的数据按照 danwei 列进行排序,将 NULL 值放在最前: SELECT * FROM perexl ORDER BY danwei ...

    pg与oracle语法差异

    - **Oracle**: 使用 `rownum` 来获取结果集中行的编号。 - **PostgreSQL**: 使用 `LIMIT` 和 `OFFSET` 关键字来实现类似的功能。 #### 十、临时表 - **Oracle**: 创建的临时表在不同会话之间共享定义,但数据隔离。...

    如何在Oracle中实现搜索分页查询

    当尝试直接使用ROWNUM进行范围筛选,如`WHERE ROWNUM BETWEEN 30 AND 49`,这种方法是无效的,因为ROWNUM在第一条记录被选取时就已确定,导致无法获取30到49之间的行。 正确的做法是先选取所有可能的行,然后在外部...

    Oracle 3种分页SQL方法比较

    Oracle 12c引入了更符合标准的分页语法,使用FETCH NEXT和OFFSET关键字,这使得代码更易读且性能有所提升。以下是如何使用此方法获取第5页数据: ```sql SELECT * FROM YourTable ORDER BY SomeColumn OFFSET 40 ...

    oracle与SQL server的语法差异总结

    ROWNUM只能使用小于等于(&lt;, )符号,不能使用大于等于(&gt;, &gt;=),并且如果使用等号(=),只能等于1。另外,ROWNUM可以与子查询结合,通过ORDER BY排序后,利用ROWNUM创建顺序号,如:`SELECT * FROM (SELECT a.*, ...

    oracle和db2的区别

    - 使用`SELECT * FROM TableName WHERE ROWNUM ;` - 这里`ROWNUM`是一个伪列,用于标识查询结果中的行序号。 - **DB2**: - 使用`SELECT * FROM TableName FETCH FIRST N ROWS ONLY;` - `FETCH FIRST N ROWS ...

    Sql语法转换为Oracle语法

    7. 连接操作:SQL Server使用 `JOIN ON`,Oracle也支持这种写法,但更常见的Oracle风格是 `USING` 关键字。 8. 事务处理:SQL Server使用 `BEGIN TRANSACTION`,`COMMIT` 和 `ROLLBACK`,Oracle也有对应的 `BEGIN`...

    oracle学习及练习语句

    Oracle提供了`DISTINCT`关键字去除查询结果中的重复行,而在`删除重复记录sql.txt`中,你可能看到如何使用`GROUP BY`和`HAVING`结合`MIN/MAX`函数,或者`MERGE`语句来删除重复记录。`oracle-merge.txt`文件则介绍了...

    oracle 分页语句

    - 除了使用`ROWNUM`之外,还可以采用其他技术来实现分页查询,例如使用`OFFSET/FETCH`关键字(在Oracle 12c及以上版本支持),这样可以直接指定跳过的行数和需要返回的行数。 #### 总结 通过以上分析,我们可以...

    从Sql Server迁移到 Oracle 过程中代码需要调整的地方

    Oracle中没有等效的直接方法,通常使用`rownum`结合子查询实现类似效果,如`SELECT * FROM (SELECT * FROM TABLEA ORDER BY field1) a WHERE ROWNUM 。 4. **列别名**: - SQL Server中,列别名可以写作`alias = ...

Global site tag (gtag.js) - Google Analytics