从Oracle迁移到PostgreSQL时按和rownum排序同级
我正在将一个项目从Oracle迁移到PG,但一个sql查询有问题 这是我的桌子:从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)
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中相同。