gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:34:43 24 4
gpt4 key购买 nike

我正在将一个项目从 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;
order siblings by 的解决方案我从这里拿的 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 时 ORDER sibling BY 和 rownum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62643746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com