首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Postgres 11中突破递归查询

在Postgres 11中突破递归查询
EN

Database Administration用户
提问于 2019-05-24 10:32:15
回答 2查看 1.8K关注 0票数 5

我在从树结构中获取正确数据时遇到了一些困难,在树结构中,我只希望分支匹配条件中的第一个节点是查询的结果。

我有一张域表:

代码语言:javascript
复制
create table domains(
    id bigint,
    domain_name varchar,
    parent_id bigint,
    valid boolean
)

insert into domains values
    (1, 'example.com', null, false),
    (2, 'a.example.com', 1, true),
    (3, 'b.example.com', 1, false),
    (4, 'c.b.example.com', 3, true),
    (5, 'd.a.example.com', 2, true)

这给出了这棵树,该树的有效域为绿色:

基于此,我希望a.example.comc.b.example.com作为有效域返回。如果顶级域example.com有效,则只应返回该域。(“有效”只是在其他地方确定的标志。)

我有一个递归查询,它获取整个域树:

代码语言:javascript
复制
WITH RECURSIVE valid_domains AS (
  SELECT id, domain_name, valid FROM domains
  WHERE parent_id IS NULL

  UNION ALL

  SELECT d.id, d.domain_name, d.valid FROM domains d
  JOIN valid_domains vd ON d.parent_id = vd.id
)
SELECT * FROM valid_domains

...but --那么我的绊脚石就是弄清楚如何在有效域上过滤,当我点击一个有效的分支时,它就会中断,而不会在它下面返回任何有效的域。

我看过窗口函数,但到目前为止还未能将其与递归查询相结合。我是不是采取了错误的方法,使这个递归在第一?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2019-05-24 11:06:01

代码语言:javascript
复制
WITH RECURSIVE cte AS (
  SELECT id, domain_name, valid 
  FROM domains
  WHERE parent_id IS NULL
UNION ALL
  SELECT domains.id, domains.domain_name, domains.valid 
  FROM domains
  JOIN cte ON domains.parent_id = cte.id
  WHERE NOT cte.valid -- stop recursion when valid node reached
)

SELECT id, domain_name
FROM cte
WHERE valid

小提琴

票数 4
EN

Database Administration用户

发布于 2019-05-24 11:02:40

你差点就到了:

代码语言:javascript
复制
WITH RECURSIVE valid_domains AS (
  SELECT id, domain_name, valid FROM domains
  WHERE parent_id IS NULL

  UNION ALL

  SELECT d.id, d.domain_name, d.valid FROM domains d
  JOIN valid_domains vd ON d.parent_id = vd.id
)
SELECT *
FROM valid_domains
WHERE valid
LIMIT 1;

我想您只需要过滤有效的答案,然后使用LIMIT只获得第一个结果.

不过,您可能需要添加一个ORDER BY子句.

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

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

复制
相关文章

相似问题

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