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

Oracle含CONNECT BY的查询迁移至PostgreSQL求助

Oracle转PostgreSQL迁移方案

以下是你提供的Oracle查询对应的PostgreSQL版本,重点解决了CONNECT BY的替代问题:

WITH readyForHouseKeeper AS (
  SELECT regexp_substr(system_file_path, '^.*/') AS path
  FROM cognito.patent p
  JOIN cognito.pat_tracking pt
    ON p.ref_id = pt.pat_ref_id
   AND p.language = 'es'
   AND p.stage_id = 80
   AND pt.stage_id = 80
   AND pt.status_date BETWEEN (localtimestamp - INTERVAL '2 months') AND (localtimestamp - INTERVAL '1 month') -- 筛选60天到30天前的数据
  ORDER BY pt.status_date
  LIMIT 50000 -- 替代Oracle的rownum < 50001
)
SELECT h.path || ' ' || file_type || ' 30 * f rm'
FROM readyForHouseKeeper h
CROSS JOIN (
  SELECT trim(regexp_split_to_table('stripped_cxml_*;MachineOutput_NameFile_cxml_*;Low_Confidence_*;*ContentFile*', ';')) AS file_type
) ft;

关键改动说明

1. 替换rownum为LIMIT

Oracle的rownum < 50001用于限制返回前50000条数据,PostgreSQL中用LIMIT 50000实现相同效果。注意PostgreSQL需要将ORDER BY和LIMIT放在同一条SELECT语句中,才能保证先排序再取数(原Oracle中ORDER BY搭配rownum无法保证排序生效,因为Oracle会先生成rownum再执行排序)。

2. 替换CONNECT BY字符串拆分逻辑

原Oracle通过层级查询CONNECT BY拆分分号分隔的字符串,PostgreSQL提供了更简洁的regexp_split_to_table函数,直接将字符串按指定分隔符拆分成多行。配合trim()去除拆分后元素的多余空格,和原逻辑完全一致。

3. 语法细节调整

  • PostgreSQL中INTERVAL支持'2 months'写法(和Oracle的'2' MONTH等效,这里采用更符合PostgreSQL习惯的写法)
  • 显式使用CROSS JOIN替代原查询的隐式笛卡尔积写法,让SQL逻辑更清晰(原查询的逗号连接表等价于CROSS JOIN)

内容的提问来源于stack exchange,提问作者Asad Rao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:06:51