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
相关推荐
注意:对 rownum(伪列) 只能使用 < 或 <=, 而用 =, >, >= 都将不能返回任何数据 例:查询工资前20名的员工姓名,工资 ,工资由高到低 Select rownum,first_name,salary from (Select first_name, salary ...
在 Oracle 中,如果你想要获取表中的第一条记录,你可以使用如下的 `ROWNUM` 写法: ```sql SELECT * FROM t WHERE ROWNUM = 1 ORDER BY id; ``` 而在 MySQL 中,要达到相同的效果,你需要使用 `LIMIT` 关键字配合...
在Oracle数据库中,`ROWNUM`是一个特殊的关键字,它为每一行返回一个唯一的数字,表示该行在查询结果集中的位置。`ROWNUM`在处理分页查询时非常有用,因为它允许我们按指定的顺序获取结果集的一部分。以下是使用`...
rownum是Oracle关键字。 存储是来自http://blog.csdn.net/pharaohsprince/archive/2006/04/12/660800.aspx。 对存储过程做了简单的修改方法程序的调用。 效率不是很高,如有高人写出很厉害的分页存储过程,希望您...
在Oracle中,我们可以使用RowNum函数来实现分页查询。RowNum函数可以返回当前记录的行号,从1开始。我们可以使用RowNum函数来限制查询的记录数。 例如,以下SQL语句可以查询表t_table_name的前10条记录: ```sql ...
其中一种常用的方法就是使用`LIMIT`子句(尽管Oracle数据库本身不直接支持标准SQL中的`LIMIT`关键字,但可以通过其他方式模拟其功能)。本文将详细介绍如何在Oracle中实现类似`LIMIT`的关键字来完成分页查询。 ####...
通过以上分析可以看出,尽管达梦数据库旨在兼容Oracle的部分功能,但在实际应用中仍需注意两者之间的差异,特别是在字段名处理、数据类型使用、语法关键字等方面。了解这些差异有助于更好地利用这两种数据库系统,并...
在 Oracle 中,可以使用 NULLS FIRST 关键字对数据进行排序,将 NULL 值放在最前。例如,以下语句将对 perexl 表中的数据按照 danwei 列进行排序,将 NULL 值放在最前: SELECT * FROM perexl ORDER BY danwei ...
- **Oracle**: 使用 `rownum` 来获取结果集中行的编号。 - **PostgreSQL**: 使用 `LIMIT` 和 `OFFSET` 关键字来实现类似的功能。 #### 十、临时表 - **Oracle**: 创建的临时表在不同会话之间共享定义,但数据隔离。...
当尝试直接使用ROWNUM进行范围筛选,如`WHERE ROWNUM BETWEEN 30 AND 49`,这种方法是无效的,因为ROWNUM在第一条记录被选取时就已确定,导致无法获取30到49之间的行。 正确的做法是先选取所有可能的行,然后在外部...
Oracle 12c引入了更符合标准的分页语法,使用FETCH NEXT和OFFSET关键字,这使得代码更易读且性能有所提升。以下是如何使用此方法获取第5页数据: ```sql SELECT * FROM YourTable ORDER BY SomeColumn OFFSET 40 ...
ROWNUM只能使用小于等于(<, )符号,不能使用大于等于(>, >=),并且如果使用等号(=),只能等于1。另外,ROWNUM可以与子查询结合,通过ORDER BY排序后,利用ROWNUM创建顺序号,如:`SELECT * FROM (SELECT a.*, ...
- 使用`SELECT * FROM TableName WHERE ROWNUM ;` - 这里`ROWNUM`是一个伪列,用于标识查询结果中的行序号。 - **DB2**: - 使用`SELECT * FROM TableName FETCH FIRST N ROWS ONLY;` - `FETCH FIRST N ROWS ...
7. 连接操作:SQL Server使用 `JOIN ON`,Oracle也支持这种写法,但更常见的Oracle风格是 `USING` 关键字。 8. 事务处理:SQL Server使用 `BEGIN TRANSACTION`,`COMMIT` 和 `ROLLBACK`,Oracle也有对应的 `BEGIN`...
Oracle提供了`DISTINCT`关键字去除查询结果中的重复行,而在`删除重复记录sql.txt`中,你可能看到如何使用`GROUP BY`和`HAVING`结合`MIN/MAX`函数,或者`MERGE`语句来删除重复记录。`oracle-merge.txt`文件则介绍了...
- 除了使用`ROWNUM`之外,还可以采用其他技术来实现分页查询,例如使用`OFFSET/FETCH`关键字(在Oracle 12c及以上版本支持),这样可以直接指定跳过的行数和需要返回的行数。 #### 总结 通过以上分析,我们可以...
Oracle中没有等效的直接方法,通常使用`rownum`结合子查询实现类似效果,如`SELECT * FROM (SELECT * FROM TABLEA ORDER BY field1) a WHERE ROWNUM 。 4. **列别名**: - SQL Server中,列别名可以写作`alias = ...