我正在将一个项目从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;
我从这里得到的同级排序解决方案https://stackoverflow.com/a/17737560/5182503 . 然而,postgresql结果集中的行顺序不同于oracle结果集中的行顺序。那rownum呢?我完全停下来了。谁能帮我建立正确的pg查询?
您链接的解决方案假设存在描述符值id的自然顺序。
如果sort_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;
更新对评论的回应
由于排序顺序在整个表中不是唯一的,因此需要将其合并到层次结构数组中。我还向最终查询添加了row\u 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;
问题内容: 我们的Oracle数据库遇到了严重的性能问题,我们想尝试将其迁移到基于MySQL的数据库(直接使用MySQL,或者最好是Infobright)。 问题是,在我们实际上不知道新数据库的所有功能是否符合我们的需求之前,我们需要让旧系统和新系统至少重叠数周(如果不是几个月)。 因此,这是我们的情况: Oracle数据库由多个表组成,每百万行。白天,实际上有成千上万的语句,我们无法停止迁移。
我正在将我的java应用程序从Oracle JDK迁移到AdoptopenJDK,那么迁移到AdoptopenJDK需要做哪些更改。
我有一个针对Oracle数据库的规范top-N查询,这是所有常见问题解答和Howto建议的: 它在Oracle 11上运行良好,即它按内部选择中指定的顺序返回前N个记录。 然而,它在Oracle 12上中断。它仍然返回相同的前N个记录,但它们可能会被洗牌。这些记录的最终顺序是不确定的。 我在谷歌上搜索了一下,但没有找到任何相关的讨论。看起来其他人总是从这样的选择中获得正确的记录顺序。 不过有一个发
我正在将我的项目从Oracle JDK迁移到open JDK。 该项目是maven构建的,所有依赖项都在pom文件中。 我想知道是否有一种方法可以使用我的pom.xml文件,并用等效的开源JAR获得我所有的JAR? 到目前为止,我正在手动查看每个JAR的发行说明,并检查是否有开源许可证。 这里,当我说Oracle licensed时,我的意思是它不是一个开源的JAR。 感谢你的帮助!!!!干杯!!
我们有一个内置于10g的oracle表单和报表应用程序。我们计划将应用程序从10g迁移到12c。 我们可以像在10g中那样在12c中简单地编译表单吗?或者我们需要在12c builder中重新编写完整的代码。 如果有人对此有任何文章,请分享链接。这对于理解迁移的需求非常有帮助。 谢啦
问题内容: 我有2个表格-包含课程ID和课程名称的课程以及包含每个课程标签的tagCourse。 我想编写一个函数,该函数按给定的标签数组搜索课程,并按匹配标签的数量将其返回。但是我不知道如何正确,有效地编写它。请帮我。 IE。 问题答案: CREATE OR REPLACE FUNCTION search_by_tags(tags varchar[]) RETURNS TABLE (id_cou