当前位置: 首页 > 面试题库 >

postgres-具有递归

空慈
2023-03-14
问题内容

我期望以下内容返回所有元组,将层次结构中的每个父级解析到顶部,但它仅返回最低级别(在查询中指定了其ID)。如何为给定的level_id返回整棵树?

create table level(
level_id int,
level_name text,
parent_level int);

 insert into level values (197,'child',177), (  177, 'parent', 3 ), (  2, 'grandparent',  null  );

WITH RECURSIVE recursetree(level_id, levelparent) AS (
 SELECT level_id, parent_level 
 FROM level 
 where level_id = 197

UNION ALL
SELECT t.level_id, t.parent_level
FROM level t, recursetree rt 
WHERE rt.level_id = t.parent_level
)

SELECT * FROM recursetree;

问题答案:

首先,如果您确实是祖父母,则(2, 'grandparent', null)应该如此(3, 'grandparent', null)。其次,您在查询的递归一半中的(隐式)连接条件是向后的,您想让父级脱离,rt.levelparent而不是t.parent_level

WITH RECURSIVE recursetree(level_id, levelparent) AS (
    SELECT level_id, parent_level 
    FROM level 
    WHERE level_id = 197

    UNION ALL

    SELECT t.level_id, t.parent_level
    FROM level t JOIN recursetree rt ON rt.levelparent = t.level_id
    -- join condition fixed and ANSI-ified above
)
SELECT * FROM recursetree;


 类似资料:
  • 我正在运行Postgres 9.5,并试图基于3个字段创建一个唯一的约束。我遇到的问题是,其中两列可以为NULL,因此这些字段为NULL的行不会违反唯一约束。我的目标是将其作为一个约束,因为我正在尝试更新冲突(UPSERT)。 桌子的结构是这样的 我在这里发现了另一个问题,我可以按照以下方式做一些事情 我不确定在where子句中有两个字段时这是否真的有效,但如何在冲突时调用这个唯一索引呢? 或者我

  • 问题内容: 我正在使用SQL Server 2008 R2 SP1。我想通过“走树”来递归地为某个组织单位找到第一个非空经理。 我有一个包含组织单位“ ORG”的表,一个包含每个组织的父母的表。“ ORG”中的部门,将其称为表“”,其中一个表包含每个组织部门的经理,将其称为“ ”。 ORG具有一列ORG_ID: ORG_PARENTS有两列。 管理器有两列。 我正在尝试创建一个递归查询,该查询将为

  • 问题内容: 我在JSON数据类型(Postgres 9.3)下以Postgres存储了JSON文档,我需要递归地收集树下的键名。 例如,给定此JSON树 我想提取类似[file1,file2,file3,file3,package1,package2,package3,package4]的内容 基本上只列出了可用于文本搜索索引的键。 我知道我可以使用以下方法在最外面的对象上列出键 而且我知道可以使

  • 问题内容: 我正在尝试使用Golang sqlx库创建准备好的语句。我想让表名成为bindVar 但是,这给了我一个语法错误。我可以不使用绑定变量作为表名吗? 问题答案: 我可以不使用绑定变量作为表名吗? 不,报价来源。 参数只能用作数据值,不能用作标识符。因此,例如,这是合理的: 但这不起作用: 但是,如果需要,可以使用表名,而将$ 1,$ 2,…保留为数据值。

  • 我对Postgres Unique约束有问题,该约束包含多个可能包含空值的列。 让我们假设这种情况: Insert将插入('foo',bar')一次和('foo',NULL)两次(尽管直觉告诉它应该插入一次)。 在这种情况下,解决方案非常简单。我可以添加唯一的索引 但是当有更多的列和不同的类型(不仅仅是文本)时,问题就开始了。假设我们有10列,其中9列可以有值。也许我可以用大量的限制来解决它,但这

  • 问题内容: 我有一个类似(简化)的表结构: 内容 content_has_content topic_has_content 任何主题都可以具有多个“内容”,任何“内容”都可以具有多个“子内容”(内容实例)。对于给定的id_topic,我想从链接的内容,子内容,子内容的子内容等中接收所有my_string1的列表。 我了解“ WITH”不适用于mysql,但找不到很好的递归替代方法。 谢谢丹尼尔