当前位置: 首页 > 知识库问答 >
问题:

从Oracle迁移到PostgreSQL时按和rownum排序同级

麻和雅
2023-03-14

我正在将一个项目从Oracle迁移到PG,并且遇到一个sql查询问题。

这是我的桌子:

CREATE TABLE descriptor_value (
    descriptor_value_id bigint NOT NULL,
    descriptor_group_id bigint NOT NULL,
    full_value varchar(4000) NOT NULL,
    short_value varchar(250),
    value_code varchar(30),
    sort_order bigint NOT NULL,
    parent_value_id bigint,
    deleted smallint NOT NULL DEFAULT 0,
    portal smallint NOT NULL DEFAULT 0
) ;

这是我正在迁移的原始oracle查询:

select rownum as ROW_NUM, DESCRIPTOR_VALUE_ID 
         from DESCRIPTOR_VALUE
         connect by prior DESCRIPTOR_VALUE_ID = PARENT_VALUE_ID
               start with PARENT_VALUE_ID is null
                      and DESCRIPTOR_GROUP_ID = (select DESCRIPTOR_GROUP_ID
                                                   from DESCRIPTOR_VALUE
                                                  where DESCRIPTOR_VALUE_ID = 867)
               order siblings by SORT_ORDER;

这是我的postgresql查询:

WITH RECURSIVE descriptor_values AS (
            SELECT
                    ARRAY[descriptor_value_id] AS hierarchy,
                    descriptor_value_id,
                    parent_value_id,
                    sort_order
            FROM
                    descriptor_value
            WHERE
                    parent_value_id IS NULL AND descriptor_group_id = (
                        SELECT descriptor_group_id
                        FROM descriptor_value
                        WHERE descriptor_value_id = 867)
            UNION ALL
            SELECT
                    descriptor_values.hierarchy || dv.descriptor_value_id,
                    dv.descriptor_value_id,
                    dv.parent_value_id,
                    dv.sort_order
            FROM
                    descriptor_value dv
            JOIN descriptor_values ON dv.parent_value_id = descriptor_values.descriptor_value_id

    ) SELECT
            descriptor_value_id
    FROM
            descriptor_values order by hierarchy;

我从这里得到的同级排序解决方案https://stackoverflow.com/a/17737560/5182503 . 然而,postgresql结果集中的行顺序不同于oracle结果集中的行顺序。那rownum呢?我完全停下来了。谁能帮我建立正确的pg查询?

共有1个答案

马泰
2023-03-14

您链接的解决方案假设存在描述符值id的自然顺序。

如果sort_order在表上是唯一的,那么下面的查询应该有效。

如果没有,那么我们将不得不对您放入层次结构数组中的值进行一些猴子操作。

WITH RECURSIVE descriptor_values AS (
            SELECT
                    ARRAY[sort_order] AS hierarchy,
                    descriptor_value_id,
                    parent_value_id,
                    sort_order
            FROM
                    descriptor_value
            WHERE
                    parent_value_id IS NULL AND descriptor_group_id = (
                        SELECT descriptor_group_id
                        FROM descriptor_value
                        WHERE descriptor_value_id = 867)
            UNION ALL
            SELECT
                    descriptor_values.hierarchy || dv.sort_order,
                    dv.descriptor_value_id,
                    dv.parent_value_id,
                    dv.sort_order
            FROM
                    descriptor_value dv
            JOIN descriptor_values ON dv.parent_value_id = descriptor_values.descriptor_value_id

    ) SELECT
            descriptor_value_id
    FROM
            descriptor_values
    order by hierarchy;

更新对评论的回应

由于排序顺序在整个表中不是唯一的,因此需要将其合并到层次结构数组中。我还向最终查询添加了row\u number()

WITH RECURSIVE descriptor_values AS (
            SELECT
                    ARRAY[sort_order, descriptor_value_id] AS hierarchy,
                    descriptor_value_id,
                    parent_value_id,
                    sort_order
            FROM
                    descriptor_value
            WHERE
                    parent_value_id IS NULL AND descriptor_group_id = (
                        SELECT descriptor_group_id
                        FROM descriptor_value
                        WHERE descriptor_value_id = 867)
            UNION ALL
            SELECT
                    descriptor_values.hierarchy 
                       || array[dv.sort_order, dv.descriptor_value_id]
                    dv.descriptor_value_id,
                    dv.parent_value_id,
                    dv.sort_order
            FROM
                    descriptor_value dv
            JOIN descriptor_values ON dv.parent_value_id = descriptor_values.descriptor_value_id

    ) SELECT
            row_number() over (order by hierarchy), 
            hierarchy,
            descriptor_value_id
    FROM
            descriptor_values 
   order by hierarchy;
 类似资料:
  • 问题内容: 我们的Oracle数据库遇到了严重的性能问题,我们想尝试将其迁移到基于MySQL的数据库(直接使用MySQL,或者最好是Infobright)。 问题是,在我们实际上不知道新数据库的所有功能是否符合我们的需求之前,我们需要让旧系统和新系统至少重叠数周(如果不是几个月)。 因此,这是我们的情况: Oracle数据库由多个表组成,每百万行。白天,实际上有成千上万的语句,我们无法停止迁移。

  • 我正在将我的java应用程序从Oracle JDK迁移到AdoptopenJDK,那么迁移到AdoptopenJDK需要做哪些更改。

  • 我有一个针对Oracle数据库的规范top-N查询,这是所有常见问题解答和Howto建议的: 它在Oracle 11上运行良好,即它按内部选择中指定的顺序返回前N个记录。 然而,它在Oracle 12上中断。它仍然返回相同的前N个记录,但它们可能会被洗牌。这些记录的最终顺序是不确定的。 我在谷歌上搜索了一下,但没有找到任何相关的讨论。看起来其他人总是从这样的选择中获得正确的记录顺序。 不过有一个发

  • 我正在将我的项目从Oracle JDK迁移到open JDK。 该项目是maven构建的,所有依赖项都在pom文件中。 我想知道是否有一种方法可以使用我的pom.xml文件,并用等效的开源JAR获得我所有的JAR? 到目前为止,我正在手动查看每个JAR的发行说明,并检查是否有开源许可证。 这里,当我说Oracle licensed时,我的意思是它不是一个开源的JAR。 感谢你的帮助!!!!干杯!!

  • 我们有一个内置于10g的oracle表单和报表应用程序。我们计划将应用程序从10g迁移到12c。 我们可以像在10g中那样在12c中简单地编译表单吗?或者我们需要在12c builder中重新编写完整的代码。 如果有人对此有任何文章,请分享链接。这对于理解迁移的需求非常有帮助。 谢啦

  • 问题内容: 我有2个表格-包含课程ID和课程名称的课程以及包含每个课程标签的tagCourse。 我想编写一个函数,该函数按给定的标签数组搜索课程,并按匹配标签的数量将其返回。但是我不知道如何正确,有效地编写它。请帮我。 IE。 问题答案: CREATE OR REPLACE FUNCTION search_by_tags(tags varchar[]) RETURNS TABLE (id_cou