首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Oracle CONNECT BY迁移到postgresql 10

将Oracle CONNECT BY迁移到postgresql 10
EN

Stack Overflow用户
提问于 2019-10-18 15:36:38
回答 1查看 104关注 0票数 2

我有这样一个SQL:

代码语言:javascript
复制
SELECT count(*) as ct
          FROM classifications cls
WHERE
   cls.classification_id = :classification_id
START WITH cls.classification_id = :root_classification_id
CONNECT BY NOCYCLE PRIOR cls.classification_id = cls.parent_id

并需要将其迁移到PostgreSQL10。

我已经安装了扩展tablefunc并尝试使用connectedby。下面是我的尝试:

代码语言:javascript
复制
SELECT count(*) as ct
          FROM classifications cls
WHERE
   cls.classification_id = :classification_id

union
                  SELECT count(classification_id) FROM connectby('classifications','classification_id','parent_id',:root_classification_id,5)
                  as t(classification_id varchar, parent_id varchar,level int) 

问题是,联合是错误的方式,因为这样会得到计数的2个结果。

EN

回答 1

Stack Overflow用户

发布于 2019-10-18 15:42:46

不需要使用tablefunc扩展名。这可以使用recursive CTE很容易地完成

代码语言:javascript
复制
with recursive tree as (

  select cls.classification_id, cls.parent_id 
  from classifications cls
  where cls.classification_id = :root_classification_id

  union all

  select child.classification_id, child.parent_id
  from classifications child
     join tree parent on child.parent_id = parent.classification_id
)
select count(*)
from tree;

CTE中的第一个查询与甲骨文的start with中的start with部件匹配。并且第二个查询中返回到CTE的联接与Oracle查询中的connect by部件相匹配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58446048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档