sql - 从 Oracle 迁移到 PostgreSQL 时对 sibling BY 和 rownum 进行 ORDER

标签 sql oracle postgresql

我正在将一个项目从 Oracle 迁移到 PG,但一个 sql 查询出现问题。

这是我的 table :

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;

我从这里获取的订购 sibling 的解决方案 https://stackoverflow.com/a/17737560/5182503 。但是,postgresql 结果集中的行顺序与 oracle 结果集中的行顺序不同。 rownum 在这里我完全停了下来。谁能帮助我构建正确的 pg 查询?

最佳答案

您链接的解决方案假定 descriptor_value_id 存在自然排序。

如果sort_order在表中是唯一的,那么下面的查询应该可以工作。

如果没有,那么我们将不得不对您放入 hierarchy 数组中的值进行一些胡闹。

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_order 在整个表中不是唯一的,因此需要将其合并到 hierarchy 数组中。我还将 row_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;

关于sql - 从 Oracle 迁移到 PostgreSQL 时对 sibling BY 和 rownum 进行 ORDER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62643746/

相关文章:

java - Hibernate 不提交数据

oracle - 每组最大的行 - 进一步将结果集与左连接与 Hibernate 中的其他相关表相结合 - HQL。是否可以?

postgresql - 如何从 Node.js 中的 Lambda 函数在 PostgreSQL RDS 上运行 SQL?

java - 时区中性应用程序

sql - ORACLE 更新返回旧值和新值

mysql - 向 SELECT 查询添加更多特异性会使其更快吗?

mysql - 运行 SQL 查询时更改表的值

sql - 有没有更优雅的方式来重用代码块?

oracle - ROracle SELECT 语句中的绑定(bind)参数

sql - 具有表值参数的参数化查询