我正在将一个项目从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;
解决方案 order siblings by
我从这里拿走了https://stackoverflow.com/a/17737560/5182503 . 但是,postgresql结果集中的行顺序与oracle结果集中的行顺序不同。罗纳姆呢?我完全停下来了。有人能帮我建立正确的pg查询吗?
1条答案
按热度按时间xoshrz7s1#
您链接的解决方案假设
descriptor_value_id
.如果
sort_order
在表上是唯一的,那么下面的查询应该可以工作。如果没有,那么我们将不得不在你的价值观中做一些虚假的交易
hierarchy
数组。根据评论更新
自
sort_order
不是整个表中唯一的,它需要合并到hierarchy
数组。我还添加了row_number()
转到最后一个查询。