SQL语句如下:
SELECT rownum ,orderhist.orderid ,orderhist.senddt,contact.name, from orderhist inner join contact
on orderhist.contactid=contact.contactid where 1=1 and rownum between 1 and 40orderhist 为订单表 contact为联系人表
执行上面的语句 可以得到 rownum为 1-40的信息
格式如下:
rownum orderid senddt name1 65445 2009-08-27 张三
。。
但是为什么改成 只要把 between 后面的1 改成其他任意数字 就查不出来了
SELECT rownum ,orderhist.orderid ,orderhist.senddt,contact.name, from orderhist inner join contact
on orderhist.contactid=contact.contactid where 1=1 and rownum between 2 and 40 查不到数据 怎么回事 ?
SELECT rownum ,orderhist.orderid ,orderhist.senddt,contact.name, from orderhist inner join contact
on orderhist.contactid=contact.contactid where 1=1 and rownum between 1 and 40orderhist 为订单表 contact为联系人表
执行上面的语句 可以得到 rownum为 1-40的信息
格式如下:
rownum orderid senddt name1 65445 2009-08-27 张三
。。
但是为什么改成 只要把 between 后面的1 改成其他任意数字 就查不出来了
SELECT rownum ,orderhist.orderid ,orderhist.senddt,contact.name, from orderhist inner join contact
on orderhist.contactid=contact.contactid where 1=1 and rownum between 2 and 40 查不到数据 怎么回事 ?
Conditions testing for ROWNUM values greater than a positive integer are always false. For example, this query returns no rows:SELECT * FROM employees
WHERE ROWNUM > 1;
SELECT rownum rn,orderhist.orderid ,orderhist.senddt,contact.name, from orderhist inner join contact
on orderhist.contactid=contact.contactid where 1=1 and rownum<= 40
) where rn > 2
rownum是对查询结果添加的一个伪列。没有1就不存在2,也不存在3.4.5.。。
rownum和order放在同一级查询语句里无效,因为order是将查询结果在内存里进行排序,排序前rownum已生成
用rownum>1不会产生结果
要实现分页功能,可采取取列别名的方法,如楼上的代码
SELECT *
FROM (SELECT a.*,rownum rn FROM t1 a)
WHERE rn BETWEEN 21 AND 40;
rownum 找不到第一个,就停止了
rownum 是Key stop
SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact
on orderhist.contactid=contact.contactid where 1=1 and rownum between 1 and 300
这样写没问题 SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact
on orderhist.contactid=contact.contactid where 1=1 and rownum between 2 and 300
查不出数据 因为Rownum是从1开始,如果第一项不匹配,后面的就都不匹配 这就是为什么写成 between 0 and ..... 或者 between 1 and .....
rownum>0 rownum>=1 都可以查询到数据 而 between 2 and ..... rownum>1 却查不到数据 嵌套查询可以解决该问题 select * from (
SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact
on orderhist.contactid=contact.contactid where 1=1 and rownum<=400) where rnm >= 30或者
select * from (
SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact
on orderhist.contactid=contact.contactid where 1=1) where rnm >= 30 and rnm<=400或者
select * from (
SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact
on orderhist.contactid=contact.contactid where 1=1) where rnm between 30 and 400
SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact
on orderhist.contactid=contact.contactid where 1=1 and rownum between 1 and 300 因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果必须有1
上面的SQL语句 是先得到返回结果集 然后才有RowNum
select * from (
SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact
on orderhist.contactid=contact.contactid where 1=1 and rownum <=400) where rnm >= 30 括号里面的子查询 也是得到结果集 然后才有了Rownum,但是对于外面的查询而言 Rownum已提前生成 所以才可以这么写 有一个先后顺序 不知道我的理解对否,各位继续补充
rownum和rowid都是一个伪列.
rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件就不会有 rownum那些情况发生,rownum不能以任何基表的名称作为前缀,而rownum则是“货真价实”的伪列 。