【问题标题】:Convert complex Oracle query into Postgre将复杂的 Oracle 查询转换为 Postgre
【发布时间】:2018-07-31 14:33:23
【问题描述】:

我是 Oracle 的新手。我想将此 Oracle 查询转换为 PostgreSQL。但我不明白 'start_date + level-1' 是什么意思。什么是'v'?这些术语:LEVELCONNECT BY 对我来说是新的。我查看了一些示例以了解 WITH、CONNECT BY、LEVEL 通常的含义。但是我仍然不知道如何将其转换为 postgreSql。

WITH t AS
          (
            SELECT start_date + level-1 As date1
            FROM
            (
              SELECT created_at date1, last_date As date2 FROM dual
            ) v
            CONNECT BY date1 + level-1 <= date2
          )
          SELECT ( ..... )

我的 PostgreDB 中有 tablefunc 扩展。在几篇文章中了解这一点。有人可以简要解释一下这里发生了什么并帮助我将其转换为 postgreSql 吗?另外,如果您可以提供任何可以清楚解释这些术语的链接,那对我来说将是非常有益的。

谢谢。

【问题讨论】:

  • 问题是你表中的一个字段吗?
  • level 是一个 Oracle 关键字,用于其分层查询功能。这就是connect by 语法。基本上,您拥有的代码是一个 Oracle 技巧,用于生成两个边界之间的日期范围。

标签: sql database oracle postgresql oracle11g


【解决方案1】:

使用generate_series():

select date1
from generate_series(created_at, last_date, interval '1 day') gs(date1)

您的查询没有定义列的来源,但这通常可以用作:

select t.*, gs.date1
from t cross join lateral
     generate_series(t.created_at, t.last_date, interval '1 day') gs(date1)

【讨论】:

    【解决方案2】:

    这与 oracle 特定的递归语句相反。上面的答案提供了一种无需递归即可获得它的替代方法。如果你想要递归,在 postgresql 中你可以使用递归 CTE,例如:

    with recursive t1 (date1) as
    (select created_at as date1 from dual
    union all
    select date1+1 as date1
    from t1
    where date1+1<=last_date)
    
    select * from t1;
    

    oracle 通过描述连接 https://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm#SQLRF52315 postresql 中的递归 CTE https://www.postgresql.org/docs/9.1/static/queries-with.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 2018-11-01
      • 2013-07-10
      • 1970-01-01
      相关资源
      最近更新 更多