Oracle递归Connect By插入语句转PostgreSQL实现咨询
把Oracle批量插入语句转换为PostgreSQL版本
嘿,我来帮你搞定这个转换~ 先明确下原Oracle语句的逻辑:它通过CONNECT BY ROWNUM <=1000生成1000行数据,然后给三个字段分别生成递增值:col1是AN拼接1000001到1001000,col2是EXT拼接9000001到9001000,col3是1到1000的序号。
PostgreSQL里没有CONNECT BY和ROWNUM,但我们有更简洁的方式来实现,这里给你两种方案:
方案1:用generate_series(最推荐,简洁高效)
PostgreSQL自带的generate_series函数可以直接生成连续的数字序列,完美替代Oracle的CONNECT BY生成多行的逻辑,代码如下:
INSERT INTO tableName (col1, col2, col3) SELECT 'AN' || (1000000 + num), 'EXT' || (9000000 + num), num FROM generate_series(1, 1000) AS nums(num);
这里generate_series(1,1000)直接生成1到1000的整数,我们给它起个别名nums(num),然后直接用num代替原语句里的ROWNUM,逻辑和原Oracle语句完全一致,而且性能更好。
方案2:用CTE结合ROW_NUMBER()(满足你提到的CTE需求)
如果你一定要用CTE的方式,也可以先通过generate_series生成基础行,再用ROW_NUMBER()生成序号,代码如下:
WITH generate_rows AS ( -- 生成1000行基础数据,这里用generate_series快速生成 SELECT 1 AS dummy FROM generate_series(1, 1000) ) INSERT INTO tableName (col1, col2, col3) SELECT 'AN' || (1000000 + ROW_NUMBER() OVER ()), 'EXT' || (9000000 + ROW_NUMBER() OVER ()), ROW_NUMBER() OVER () FROM generate_rows;
不过这个方案其实有点绕,因为generate_series已经直接给出了序号,方案1更直接。但如果是复杂场景下需要CTE来做更多预处理,这种写法就适用。
补充说明:PostgreSQL里没有Oracle那种递归生成行的CONNECT BY语法,generate_series是生成序列行的标准工具,除了整数,它还能生成日期、时间间隔序列,非常灵活。
内容的提问来源于stack exchange,提问作者flixe
相关产品推荐
相关产品推荐

