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

从Oracle迁移到PostgreSQL时按和rownum排序同级,sql,oracle,postgresql,Sql,Oracle,Postgresql,我正在将一个项目从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)

我正在将一个项目从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;

我从这里得到的
订购兄弟姐妹的解决方案。但是,postgresql结果集中的行顺序与oracle结果集中的行顺序不同。那rownum呢?我完全停下来了。有人能帮我建立正确的pg查询吗?

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

如果
sort\u 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;
根据评论进行更新

由于
sort\u order
在整个表中不是唯一的,因此需要将其合并到
层次结构
数组中。我还将
行编号()
添加到最终查询中

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;

@我更新了我的答案。请尝试新的查询,并让我知道它是否有效。非常感谢。我编辑了这一行
descriptor_values.hierarchy||array[dv.sort_order,dv.descriptor_value_id],
。但是,oracle中的结果与pg中的结果不同。您是否假设排序顺序在一个父级中?例如,如果父级A有两个子级B和C,则childB的排序顺序为0,childC的排序顺序为1。@Shtirlits它应该考虑排序顺序。尝试将
层次结构
列添加到输出中,以查看查询的作用。表中的层次结构是否有多个根元素?如果是这样,我在初始数组中添加了
sort\u order
。非常感谢。上一个解决方案给出的结果与oracle中相同。