一般我们分页查询都这么写: 嵌套的SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
这样写为什么不可以呢?SELECT * FROM A where rownum >=21 and rownum <=40
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
这样写为什么不可以呢?SELECT * FROM A where rownum >=21 and rownum <=40
在where条件中“rownum>N”的条件是没有意义的
他的记录是当你解析where之后,当你要显示列的时候才为每列显示的一个序号,
现在你在where条件里做出判断,因为此时你选择的列还没有安排位序,所以你查不到任何记录
SELECT rownum num,b.* FROM A b where b.num>=21 and b.num<=40
这样是可以的
rownum是一个序号
根据你sql查询出来的结果 第一笔数据的序号就是1
依次往下
rownum只能小于 一个数字。。
不能大于一个数字。。
select *from table rownum between 11 and 15
这个 sql查询出来的结果 是 从11到 15 的数据。。
这个时候 序列1的数据是不显示出来的
但是这个结果集一旦出来呢 第11笔数据又变成了 第1笔 。。
序号11的数据成了 序号1的数据。。但是呢。。
原本 又有个 序号为1的数据。。此时会出现两个序号1数据 冲突 。。rownum是唯一的 。。不能重复的
所以 在 查询出来的结果集 外面 嵌套一层
select t.* from (select *,rownum as num from table ) t where t.num between 11 and 15
是可以的因为此时 子句查询出来的结果 按照 当前的顺序 以及包含序号的结果 成为了一个结果集
那么这里的 rownum 成为了 别名为t 这个表(结果集)的一个字段。。
故而不存在冲突了
不知道 LZ是否明白了