文章目录
- 文档用途
- 详细信息
文档用途
当我们做数据迁移或者应用迁移时,遇到分页的问题是必不可少的,那么Oracle中我们用到rownum来限制显示的行数,在瀚高里面,我们用limit和offset字句限制只取出查询结果的部分行。
如果给出了一个 LIMIT 计数,那么将返回不超过该数字的行(也可能更少些,因为可能查询本身生成的总行数就比较少)。LIMIT ALL和省略 LIMIT子句是一样的。
OFFSET指明在开始返回行之前忽略多少行。OFFSET 0和省略 OFFSET和LIMIT NULL 子句是一样的。如果 OFFSET和 LIMIT 都出现了,那么在计算OFFSET之前先忽略 LIMIT指定的行数。
那么这个转换是如何实现的?详情信息就在下面。
详细信息
rownum替换的问题
(1)大于等于的情况:
删除rownum>=row , 其中row可能是数字或者参数或者函数
<1>select * from test where rownum >= to_number(i_start) ;
转换为
select * from test ;
<2>select * from test where rownum >= to_number(i_start) and rownum <= 10 ;
转换为
select * from test limit 10;
<3>select * from test where ID>10 and rownum >= to_number(i_start);
转换为
select * from test where ID>10 ;
<4>select * from test where rownum >= to_number(i_start) and ID>10 ;
转换为
select * from test where ID>10 ;
(2)没有大于等于的情况:
A)where之后的,限制查询出来的条数(rownum <=number 或者 rownum = 1)
<1>select * from test where rownum <=10 (条件只有rownum)
转换为select * from test limit 10
<2>select * from test where rownum <=10 and ID >5 (有其他条件rownum前边是where)
转换为select * from test where ID >5 limit 10
<3>select * from test where ID >5 and rownum <=10 (有其他条件rownum前边是and或or之类的)
转换为select * from test where ID >5 limit 10
<4>select * from test where ID >5 and rownum <=10 and ID <10 group by id order by id (有其他条件且rownum不在最后一个条件)
转换为select * from test where ID >5 and ID <10 group by id order by id limit 10
<5>select * from test where rownum = 1 (rownum = 1 和rownum<=1逻辑类似可以共用)
转换为select * from test limit 1
第一种只有一个rownum条件的话需要删除where后几种可以归结为一种 就是有其他条件(不限于and,可能有其他关联关键字or或者其他),这种情况需要替换rownum并放到最后(如果有group by或者order by放到它们后边)
如果连接符是<的话,做减一处理
B)select之后的,带别名(可能没有as来连接),查询序号 —> 用row_number() OVER ()来替换
<1>select rownum as row ,t.* from testrownum t ; (别名有as来连接)
转换为:select row_number() OVER () as row ,t.* from testrownum t ;
<2>select rownum row ,t.* from testrownum t ; (别名没有as来连接)
转换为:select row_number() OVER () as row ,t.* from testrownum t ;
C)select之后的,不带别名,查询序号 —> 用row_number() OVER () as rownum来替换
<1>select rownum ,t.* from testrownum t ;(没有别名)
转换为:select row_number() OVER () as rownum ,t.* from testrownum t ;
(3)在update或者delete中ROWNUM问题
<1> update test3 set id = (select id from test2 where id =1 and rownum=1 group by id ) where id = 0 and rownum=1 ;
转化成:
with cte as (select ctid from test3 where id = 0 limit 1)
update test3 set id = (select id from test2 where id =1 group by id limit 1) where ctid in (select ctid from cte) ;
<2> delete from test3 where id=0 and rownum = 1;
转换为:
with cte as (select ctid from test3 where id = 0 limit 1)
delete from test3 where ctid in (select ctid from cte) ;