oracle中的rownum是一个虚拟列,每输出一行递增1。但是在pg中目前没有rownum虚拟列,那么如果从oracle迁移到pg该如何实现呢?
要在pg中实现rownum我们得先弄清楚oracle中的rownum有什么作用,是如何使用的。
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数。
rownum使用场景1:分页输出
oracle中分页:
SQL> select * from t1 where rownum=1;
SQL> select * from t1 where rownum<3;
pg中分页:
pg自带的limit语法就可以很好的替代oracle中使用rownum分页的情况。
bill=
id | info
1 | 4b6a755d1e1867cf1c49e841032df9ac
(1 row)
bill=
id | info
2 | 963ffeef5f97757767e4a9af66ea61db
(1 row)
rownum使用场景2:生成序列值
oracle中可以使用rownum递增的特性来生成序列值。
oracle:
SQL> ALTER TABLE t1 ADD seqno NUMBER(3);
SQL> UPDATE t1 SET seqno = ROWNUM;
pg:
pg中可以使用临时序列来为某个字段生成序列值。
bill=
CREATE SEQUENCE
bill=
ALTER SEQUENCE
bill=
ALTER TABLE
bill=
UPDATE 10
bill=
id | info | col1
1 | 4b6a755d1e1867cf1c49e841032df9ac | 1
2 | 963ffeef5f97757767e4a9af66ea61db | 2
3 | abd59f7046720b700e267e16d7f9bab3 | 3
4 | 5e1839939b64b7a50eb5471e90b9e299 | 4
5 | 24907f7103042b4e4acf7176a019e7bc | 5
6 | c7632e2705fea35ddd6b9aa5f1413947 | 6
7 | aea6eb309fd74a45650b1ed39d8b2724 | 7
8 | 2ce882fe6ccee470b4b86e7aa9196f2e | 8
9 | 5a8a05706851b9773cde048e3a362fcc | 9
10 | c27fe91e6f80feec6914d7917b489d14 | 10
(10 rows)
除此之外,我们还可以使用窗口函数来实现行号这类功能。
bill=
rownum | id | info | col1
1 | 1 | 4b6a755d1e1867cf1c49e841032df9ac | 1
2 | 2 | 963ffeef5f97757767e4a9af66ea61db | 2
3 | 3 | abd59f7046720b700e267e16d7f9bab3 | 3
4 | 4 | 5e1839939b64b7a50eb5471e90b9e299 | 4
5 | 5 | 24907f7103042b4e4acf7176a019e7bc | 5
6 | 6 | c7632e2705fea35ddd6b9aa5f1413947 | 6
7 | 7 | aea6eb309fd74a45650b1ed39d8b2724 | 7
8 | 8 | 2ce882fe6ccee470b4b86e7aa9196f2e | 8
9 | 9 | 5a8a05706851b9773cde048e3a362fcc | 9
10 | 10 | c27fe91e6f80feec6914d7917b489d14 | 10
(10 rows)
总结:
尽管pg中不支持oracle的rownum语法,但是我们可以针对oracle中rownum不同的使用场景制定对应的解决方案来支持同样的场景。
PostgreSQL是世界上功能最强大的开源数据库,在国内得到了越来越多机构和开发者的青睐和应用。随着PostgreSQL的应用越来越广泛,Oracle向PostgreSQL数据库的数据迁移需求也越来越多。数据库之间数据迁移的时候,首先是迁移数据,然后就是SQL、存储过程、序列等程序中不同的数据库中数据的使用方式的转换。下面根据自己的理解和测试,写了一些...
select * from (select row_number() over() as rownum,tablename from pg_tables) t where rownum<10;
在后面大神的基础上做了自己的笔记,感谢阿里云的作者!写的非常好:https://yq.aliyun.com/ziliao/205351. rownum是Oracle内部的一个伪列,用来表示数据在结果集中的行数。Oracle中,把检索结果取出来后,在画面上分页显示的功能,都是使用rownum,并且使用多层子查询来实现的。2. PostgreSQL中,没有rownum这样的伪列,但是提供了 limit...
使用窗口函数row_number()
select row_number() OVER (ORDER BY id) as rownum ,* from score;
如果不关心排序,可以这样select row_number() over() as rownum,* from score;
————————————————
版权声明:本文为CSDN博主「tanweii163」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn
参考资料: http://tech.ddvip.com/2008-10/122490439383296.html
和 http://tenn.javaeye.com/blog/99339
对于Oracle的rownum问题,很多资料都说不支持>,>=,=,between……and,只能用以上符号(<、& lt;=、!=),并非说用>,>=,=,between……and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好
在postgresql中,设置已存在的某列(num)值自增,可以用以下方法:
//将表tb按name排序,利用row_number() over()查询序号并将该列命名为rownum,创建新表tb1并将结果保存到该表中
create table tb1 as (select *, row_number() over(order by name) as rownum from tb);
我对PostGreSQL只是一知半解,记录这个过程是希望如果以后微软技术方向的人遇到类似的需求,可以有个比较直接的的参考。在不熟悉的知识领域里,总是有搜索引擎可以帮到我。初步了解PostGreSQL数据库及数据形态
首先我想看看PostGreSQL的数据库以及我想要获取的数据形态是什么样子的,Linux和PostGreSQL这两个关键字我都不熟悉,搜了一下找到了一个可以连通PostGreSQL数据库的Windows客户端,叫pgAdmin,我装的是III版本,应该是比较新的,下载安装后看到界面:
点击那个电源插头的logo可以新建服务器连接
名称就是在PGAdmin客户端的显示名,可以自定义
在介绍PostgreSQL的时间函数之前,我们先来看一个问题:
bill=# select now(),pg_sleep_for('5 second'),now();
now | pg_sleep_for | now
------------------------------+--------------+------------------------------
2020-04-28 10:21:33.77725+08 | | 2020-04-28 10:21:33.77725+08
我们想把一个查询语句返回的结果集插入到多个目标表中。例如,希望把A表的数据分别插入到 B 表、C 表和 D 表。这3个表与 A 表的结构相同(相同的列和数据类型),并且当前不含任何数据。
解决办法就是把查询结果插入到多个目标表中。在oracle中我们可以使用insert all或者insert first语句,两者语法基本一致,区别在于:
insert first:对于每一行数据,只插入到第一个when条件成立的表,不继续检查其他条件。
insert all :对于每一行数据,对每一个when条件都进行检查,如果满足条件就执行插入操作。
但是在pg中是不支持该语法的,那么我们该如何实现多表插入