首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:对查询"najdi_tot“的递归引用不能出现在非递归术语中。

错误:对查询"najdi_tot“的递归引用不能出现在非递归术语中。
EN

Database Administration用户
提问于 2014-08-07 09:54:39
回答 1查看 2.2K关注 0票数 1

以下CTE查询有问题:

代码语言:javascript
复制
  WITH RECURSIVE najdi_tot(sj) AS (
    SELECT nad FROM s_vztah WHERE pod=581
    UNION
    SELECT pod FROM s_vztah WHERE nad=581
    UNION
    SELECT sv.nad FROM najdi_tot n, s_vztah sv 
    WHERE sv.pod = n.sj
    UNION
    SELECT sv.pod FROM najdi_tot n, s_vztah sv 
    WHERE sv.nad = n.sj
  )
  SELECT array_agg(sj) FROM najdi_tot

发生以下错误:

代码语言:javascript
复制
ERROR:  recursive reference to query "najdi_tot" must not appear within its non-recursive term
LINE 6:     SELECT sv.nad FROM najdi_tot n, s_vztah sv 
                               ^

我做了一个谷歌搜索( postgresql "recursive reference to query" "must not appear within its non-recursive term" ),除了邮件列表之外什么都没有找到,在那里我找不到解决方案(也许它在那里,但隐藏在讨论中)。

我的查询应该做的是找到从连接同一表中的两行的表中链接的所有行(nadpod)。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2014-08-07 09:54:39

这个问题是由递归调用中的乘法引起的。当我删除其中一个,问题就解决了:

代码语言:javascript
复制
  WITH RECURSIVE najdi_tot(sj) AS (
    SELECT nad FROM s_vztah WHERE pod=581
    UNION
    SELECT pod FROM s_vztah WHERE nad=581
    UNION
    SELECT sv.nad FROM najdi_tot n, s_vztah sv 
    WHERE sv.pod = n.sj
  )
  SELECT array_agg(sj) FROM najdi_tot

然后,我意识到这种关系是对称的--在第一次调用时,我得到了所有的链接行,递归只添加了我在开头的行。因此,我删除了递归,一切都很好:

代码语言:javascript
复制
  WITH najdi_tot(sj) AS (
    SELECT nad FROM s_vztah WHERE pod=581
    UNION
    SELECT pod FROM s_vztah WHERE nad=581
  )
  SELECT array_agg(sj) FROM najdi_tot
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/73385

复制
相关文章

相似问题

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