You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:04:18