oracle 分页查询 为什么第一次子查询用rownum,第二次用rn,其他方式都不可以呢?
4个回答
展开全部
rownum 是一个虚列,不属于表,只是用来给结果序号
要考虑结果逻辑。
比如我可以写rownum>0或者rownum >= 1,查询结果是全部结果
但是如果写rownum > 1 结果就是空的。
解答:因为第一个结果rownum应该为1,不符合,所以排除
第二条,因为第一条被排除了,这一条应被安排在结果的第一个,rownum也应该排为1,所以不符合,排除
依次类推,全部都不符合,所以结果为空
而如果我将rownum作为一个临时结果,再从这个临时结果进行查询,就可以使用这个值了
所以我们可以先成立一个临时结果:select t1.*, rownum as "rn" from t1
然后从这个结果尽心查询:select * from (select t1.*, rownum as "rn" from t1) where "rn" > 10 and "rn" <= 20
但是一般都会把小于等于放在第一个结果中,因为第一个结果是临时的,会占用内存,而且还不确定这个表的数据量具体有多大,所以,尽量减少临时结果的大小,能起到增加效率的效果
select * from (select t1.*, rownum as "rn" from t1 where rownum <= 20) where "rn" > 10
注:你提到的rn,并不是一个固定值,而是临时存放rownum的临时结果的列,起了一个名字叫rn, 在字段的后面,用[as 列名] 表示,也能用 [as "列名"]表示,语句当然可以写成:select * from (select t1.*, rownum as aaa1234 from t1) where aaa1234 > 10 and aaa1234 <= 20;
别名的命名规则基本上是毫无顾忌的。只是如果不符合命名规则,比如数字开头,拥有空格,运算符号,关键字 等情况的列名,需要用双引号引起来,但是要注意,双引号的列名,使用时也最好(非必须)用双引号,因为系统执行sql语句时,会将没有引号的字母全部翻译成大写,再执行,如果使用as "rn" ,然后使用rn查询时,查询语句中的rn会翻译成RN,与字段名的rn对应不上,报:找不到该字段的错误。(当然,如果定义为 "RN",查询语句中用rn 可以对应上,中文,大写,符号,都无大小写之分)
比如:
select * from (select t1.*, rownum as 1234 from t1) where 1234 > 10 and 1234 <= 20; 会报错,因为1234不符合字段命名规则
select * from (select t1.*, rownum as "1234" from t1) where 1234 > 10 and 1234 <= 20; 查询为空,因为后一个1234会被认为是数字,而1234<= 20是一个恒false的条件
select * from (select t1.*, rownum as "1234" from t1) where "1234" > 10 and "1234" <= 20; 查询结果正常
要考虑结果逻辑。
比如我可以写rownum>0或者rownum >= 1,查询结果是全部结果
但是如果写rownum > 1 结果就是空的。
解答:因为第一个结果rownum应该为1,不符合,所以排除
第二条,因为第一条被排除了,这一条应被安排在结果的第一个,rownum也应该排为1,所以不符合,排除
依次类推,全部都不符合,所以结果为空
而如果我将rownum作为一个临时结果,再从这个临时结果进行查询,就可以使用这个值了
所以我们可以先成立一个临时结果:select t1.*, rownum as "rn" from t1
然后从这个结果尽心查询:select * from (select t1.*, rownum as "rn" from t1) where "rn" > 10 and "rn" <= 20
但是一般都会把小于等于放在第一个结果中,因为第一个结果是临时的,会占用内存,而且还不确定这个表的数据量具体有多大,所以,尽量减少临时结果的大小,能起到增加效率的效果
select * from (select t1.*, rownum as "rn" from t1 where rownum <= 20) where "rn" > 10
注:你提到的rn,并不是一个固定值,而是临时存放rownum的临时结果的列,起了一个名字叫rn, 在字段的后面,用[as 列名] 表示,也能用 [as "列名"]表示,语句当然可以写成:select * from (select t1.*, rownum as aaa1234 from t1) where aaa1234 > 10 and aaa1234 <= 20;
别名的命名规则基本上是毫无顾忌的。只是如果不符合命名规则,比如数字开头,拥有空格,运算符号,关键字 等情况的列名,需要用双引号引起来,但是要注意,双引号的列名,使用时也最好(非必须)用双引号,因为系统执行sql语句时,会将没有引号的字母全部翻译成大写,再执行,如果使用as "rn" ,然后使用rn查询时,查询语句中的rn会翻译成RN,与字段名的rn对应不上,报:找不到该字段的错误。(当然,如果定义为 "RN",查询语句中用rn 可以对应上,中文,大写,符号,都无大小写之分)
比如:
select * from (select t1.*, rownum as 1234 from t1) where 1234 > 10 and 1234 <= 20; 会报错,因为1234不符合字段命名规则
select * from (select t1.*, rownum as "1234" from t1) where 1234 > 10 and 1234 <= 20; 查询为空,因为后一个1234会被认为是数字,而1234<= 20是一个恒false的条件
select * from (select t1.*, rownum as "1234" from t1) where "1234" > 10 and "1234" <= 20; 查询结果正常
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
限制行数 一般用rownum方便
【SQL优化】Oracle中的Top-N与分页匹配查询
http://www.askmaclean.com/archives/topn-pagination-pattern.html
【SQL优化】Oracle中的Top-N与分页匹配查询
http://www.askmaclean.com/archives/topn-pagination-pattern.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你去csdn搜一下rownum,我用手机不方便
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询