添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
暗恋学妹的消炎药  ·  Pandas KeyError on ...·  7 月前    · 
谦逊的佛珠  ·  一个需求引发的 Service ...·  10 月前    · 
彷徨的匕首  ·  JwtBearerExtensions.Ad ...·  11 月前    · 
玩手机的火腿肠  ·  IC97627: .NET ...·  1 年前    · 

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=# select * from t1 limit 1;
 id |               info               
----+----------------------------------
  1 | 4b6a755d1e1867cf1c49e841032df9ac
(1 row)
bill=# select * from t1 limit 1 offset 1;
 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 temp sequence if not exists tmp_seq;  
CREATE SEQUENCE
bill=# alter sequence tmp_seq restart with 1;  
ALTER SEQUENCE
bill=# alter table t1 add column col1 int; 
ALTER TABLE
bill=# update t1 set col1=nextval('tmp_seq');  
UPDATE 10
bill=# select * from t1;
 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=# select row_number() over () as rownum, * from t1;
 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的应用越来越广泛,OraclePostgreSQL数据库的数据迁移需求也越来越多。数据库之间数据迁移的时候,首先是迁移数据,然后就是SQL、存储过程、序列等程序中不同的数据库中数据的使用方式的转换。下面根据自己的理解和测试,写了一些... select * from (select row_number() over() as rownum,tablename from pg_tables) t where rownum&lt;10; 在后面大神的基础上做了自己的笔记,感谢阿里云的作者!写的非常好:https://yq.aliyun.com/ziliao/205351. rownumOracle内部的一个伪列,用来表示数据在结果集中的行数。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 对于Oraclerownum问题,很多资料都说不支持>,>=,=,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中是不支持该语法的,那么我们该如何实现多表插入