递归查询挑战 - 简单的父/子示例

2023-11-24

注意:在 #postgresql 上的 RhodiumToad 的帮助下,我找到了一个解决方案,我将其作为答案发布。如果有人可以对此进行改进,请加入!

我还没能适应之前的递归查询解决方案到以下有向无环图,其中包括多个“根”(无祖先)节点。我正在尝试编写一个查询,其输出通常称为闭包表:一个多对多表,存储从每个节点到其每个后代及其自身的每条路径:

1  2  11  8  4  5  7
 \/    |  |   \ | /
  3    |   \    6
   \   |    \  /
    9  |     10
     \/     /
     12    13
       \  /
        14

CREATE TABLE node (
  id        SERIAL PRIMARY KEY,
  node_name VARCHAR(50) NOT NULL
);

CREATE TABLE node_relations (
  id                 SERIAL PRIMARY KEY,
  ancestor_node_id   INT REFERENCES node(id),
  descendant_node_id INT REFERENCES node(id)
);

INSERT into node (node_name)
SELECT 'node ' || g FROM generate_series(1,14) g;

INSERT INTO node_relations(ancestor_node_id, descendant_node_id) VALUES
(1,3),(2,3),(4,6),(5,6),(7,6),(3,9),(6,10),(8,10),(9,12),(11,12),(10,13),(12,14),(13,14);

很难查明问题所在——我是不是漏掉了node_relation行?是不是查询有误?

WITH RECURSIVE node_graph AS (
   SELECT ancestor_node_id, ARRAY[descendant_node_id] AS path, 0 AS level
   FROM   node_relations

   UNION  ALL
   SELECT nr.ancestor_node_id,  ng.path || nr.descendant_node_id,ng.level + 1 AS level
   FROM   node_graph ng
   JOIN   node_relations nr ON nr.descendant_node_id = ng.ancestor_node_id 
)
SELECT path[array_upper(path,1)] AS ancestor,
       path[1] AS descendant,
       path, 
       level as depth
FROM   node_graph
ORDER  BY level, ancestor;

预期输出:

ancestor | descendant | path
---------+------------+------------------
1        | 3          | "{1,3}"
1        | 9          | "{1,3,9}"
1        | 12         | "{1,3,9,12}"
1        | 14         | "{1,3,9,12,14}"
2        | 3          | "{2,3}"
2        | 9          | "{2,3,9}"
2        | 12         | "{2,3,9,12}"
2        | 14         | "{2,3,9,12,14}"
3        | 9          | "{3,9}"
3        | 12         | "{3,9,12}"
3        | 14         | "{3,9,12,14}"
4        | 6          | "{4,6}"
4        | 10         | "{4,6,10}"
4        | 13         | "{4,6,10,13}"
4        | 14         | "{4,6,10,13,14}"
5        | 6          | "{5,6}"
5        | 10         | "{5,6,10}"
5        | 13         | "{5,6,10,13}"
5        | 14         | "{5,6,10,13,14}"
6        | 10         | "{6,10}"
6        | 13         | "{6,10,13}"
6        | 14         | "{6,10,13,14}"
7        | 6          | "{7,6}"
7        | 10         | "{7,6,10}"
7        | 13         | "{7,6,10,13}"
7        | 14         | "{7,6,10,13,14}"
8        | 10         | "{8,10}"
8        | 13         | "{8,10,13}"
8        | 14         | "{8,10,13,14}"
9        | 12         | "{9,12}"
9        | 14         | "{9,12,14}"
10       | 13         | "{10,13}"
10       | 14         | "{10,13,14}"
11       | 12         | "{11,12}"
11       | 14         | "{11,12,14}"
12       | 14         | "{12,14}"
13       | 14         | "{13,14}"

在 #postgresql 上的 RhodiumToad 的帮助下,我找到了这个解决方案:

WITH RECURSIVE node_graph AS (
    SELECT ancestor_node_id as path_start, descendant_node_id as path_end,
           array[ancestor_node_id, descendant_node_id] as path 
    FROM node_relations

    UNION ALL 

    SELECT ng.path_start, nr.descendant_node_id as path_end,
           ng.path || nr.descendant_node_id as path
    FROM node_graph ng
    JOIN node_relations nr ON ng.path_end = nr.ancestor_node_id
) 
SELECT * from node_graph order by path_start, array_length(path,1);

结果完全符合预期。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归查询挑战 - 简单的父/子示例 的相关文章

  • 如何将此本机 SQL 查询转换为 HQL

    所以我有这个很长的复杂的 Native SQLQuery string hql SELECT FROM SELECT a rownum r FROM select f2 filmid f2 realisateurid f2 titre f2
  • 选择两列中两个日期之间的记录

    如何选择两列中两个日期之间的记录 Select From MyTable Where 2009 09 25 is between ColumnDateFrom to ColumnDateTo 我有一个日期 2009 09 25 我喜欢选择
  • Postgresql:SERIAL 在约束 INSERT 失败时递增

    有一个像这样的简单表结构 CREATE TABLE test id INT PRIMARY KEY sid SERIAL 我注意到如果我尝试插入一行但它未通过约束测试 即主键约束 SERIAL计数器无论如何都会增加 所以下一次成功插入 si
  • 结果集未打开。验证自动提交已关闭。阿帕奇·德布里

    我的数据库使用 apache derby 我能够对数据库执行插入操作 以下是尝试显示我唯一的表 MAINTAB 的内容的代码摘录 java sql Connection 的实例是 dbconn ResultSet word Statemen
  • 将子查询的结果插入表中并带有常量

    相关表格的概要如下 我有一个表 我们称之为联接 它有两列 都是其他表的外键 我们将这两列称为 userid 和buildingid 因此 join 看起来像 join userid buildingid 我基本上需要在这个表中插入一堆行 通
  • 从VBA中的数组批量插入到sql中

    我正在尝试在 Excel 中构建一个按钮 将所选区域上传到 SQL Server 中的表中 第一行将自动视为列标题 这件事该怎么继续下去呢 我想要的是简单和超快的上传 这是我的想法 我将选择选定的区域 然后将其保存为 txt 文件 然后对其
  • MySQL如何根据字段是否存在来插入新记录或更新字段?

    我正在尝试实现一个评级系统 在数据库表中保留以下两个字段 评级 当前评级 num rates 迄今为止提交的评分数量 UPDATE mytable SET rating rating num rates theRating num rate
  • Oracle SQL——从字符串中删除部分重复项

    我有一个表 其中有一列包含字符串 如下所示 static text here 1abcdefg1abcdefgpxq 从这个字符串1abcdefg重复两次 所以我想删除该部分字符串 然后返回 static text here 1abcdef
  • 标记个体内事件发生后发生的日期

    我有一组长格式的数据 每人几行 人 id 其中事件 事件 1 应该只发生一次 事件发生后 该人不应再有任何数据 如果事件发生后出现任何记录 我想使用名为 flag flag 1 的新变量创建一个查询 例如 下面标记了 id 5 因为在该人的
  • SQL Server 之间

    我有一个表 其中有年 月和一些数字列 Year Month Total 2011 10 100 2011 11 150 2011 12 100 2012 01 50 2012 02 200 现在 我想要SELECT2011 年 11 月至
  • sql 查询的权限被拒绝

    我正在尝试通过经典的 asp 记录集执行以下查询 SQL Select P Name as P Name P Description as P Description from L PagePermission inner join A P
  • 从多个表中选择 - 一对多关系

    我有这样的表 表产品 身份证 姓名 表格图像 产品 ID 网址 订单号 表价 产品 ID 组合 货币 价格 表数量 产品 ID 组合 数量 表 Product 与其他表是一对多关系 我需要查询表并得到类似这样的结果 伪数组 ProductI
  • 基于列顺序的查询速度

    数据库中列类型的顺序对查询时间有影响吗 例如 具有混合排序 INT TEXT VARCHAR INT TEXT 的表的查询速度是否会比具有连续类型 INT INT VARCHAR TEXT TEXT 的表慢 答案是肯定的 这确实很重要 而且
  • 使用连接查询检索行

    我有两张这样的桌子 A B col1 col2 col1 col2 一个表包含 300k 行 B表包含400k行 如果表 A 的 col1 与表 B 的 col1 匹配 我需要计算它 我写了一个这样的查询 select count dist
  • MySQL:你能指定一个随机限制吗?

    有没有办法在 SQL MySQL 中随机化限制数字 我希望能够做的是在查询中获取随机数量的结果以在插入子查询中使用 而无需任何服务器端脚本 我希望能够作为假设说明运行的查询是 SELECT id FROM users ORDER BY RA
  • 返回行位置 - Postgres

    我返回一个带有位置的表 select from select row number over as position from organization result where data1 Hello 返回这个 这是正确的 data1 H
  • 如何在SQL Server数据库表列中存储图像[重复]

    这个问题在这里已经有答案了 我有一张名为FEMALE在我的数据库中 它有ID as Primary Key 它有一个Image column 我的问题是如何使用 SQL 查询存储图像 尝试一下 insert into tableName I
  • 整理有关 QueryDSL-JPA 的提示

    有没有办法用 QueryDSL 来执行它 粗体部分 从地点选择 其中名称如 cafe 整理 Latin1 general CI AI 我将 JPA 与 hibernate 一起使用 您可以使用addFlag QueryFlag Positi
  • 从备份恢复 PostgreSQL 数据库,没有外键约束问题

    我有一个包含大约 85 个以上表的 postgresql 数据库 我定期使用pg dump 通过 php pgadmin 在复制模式下 备份文件的大小几乎为 10 12 MB 现在我面临的问题是 每当我尝试恢复数据库时 都会出现外键约束问题
  • 如何检测 Postgres 中持有锁的查询?

    我想不断跟踪 postgres 中的互锁 我碰到锁具监控 https wiki postgresql org wiki Lock Monitoring文章并尝试运行以下查询 SELECT bl pid AS blocked pid a us

随机推荐

  • 在 Java 中使用 scala 映射

    我有两个文件 一种是scala 另一种是java Scala 文件有一个返回 scala 不可变映射的函数 Java 文件想要使用该映射作为字典 我是 scala 和 java 的新手 如何将该 scala 映射转换为 java 字典 这是
  • 关于懒惰 [ RAKU ]

    Raku 文档中指出 gather take 结构正在被延迟评估 在下面的例子中 我很难得出关于构造的惰性的结论 say Iterate to Infinity is 1 Inf WHAT say gather is gather take
  • 从asp.net获取AD用户objectGuid的身份验证

    我在 ASP NET 应用程序中使用 Windows 身份验证 我想知道如何最好地从当前登录的用户获取 objectGuid 问候 埃吉尔 建议的解决方案相当昂贵 更好的解决方案是使用 SID 来查找帐户 而不是通过域和用户名进行搜索 us
  • 按枚举描述排序

    我正在开发一个首先使用 EF 代码的 ASP NET MVC 项目 我面临着需要通过枚举描述进行排序的情况 public partial class Item public enum MyEnumE Description descript
  • JPA Criteria 使用单表继承对实体层次结构进行查询

    假设我有以下实体 Entity Inheritance strategy SINGLE TABLE DiscriminatorColumn name type public abstract class BaseEntity private
  • 使用 DocumentBuilder.parse 解析格式良好的 XML 时如何关闭验证?

    我正在使用 Java 6 我想解析我知道格式良好的 XHTML 因此 我不想对文档中引用的 DTD 或其他模式进行任何验证 但是 我无法弄清楚如何关闭该验证 我有 DocumentBuilderFactory factory Documen
  • Allegro 5 在调用 al_clear_to_color(ALLEGRO_COLOR) 时崩溃

    我从 Allegro 5 开始 但很快我就陷入了我正在编写的第二个类似 hello world 的程序中 经过一番调试 我得出结论 程序在调用该函数时崩溃了al clear to color ALLEGRO COLOR 我尝试过静态和动态链
  • 对称整数到整数加密

    我需要一些关于如何将一个 int 加密为另一个 int 的实际示例 并且需要一个密钥来解密该值 就像是 encrypt 1 secret key 67123571122 decrypt 67123571122 secret key 1 这家
  • 如何在 Asp.Net MVC 中动态插入部分视图

    我正在将 Webforms 站点迁移到 MVC 在我的网络表单网站中 我的页面利用了用户控件的各种组合 然后是 html 块 然后是标签 文本框等 我不想对每个页面进行硬连线 因此我将从 CMS 驱动每个页面的输出 该 CMS 指定将控件插
  • bash Heredoc 可以将其结果直接放入变量中吗?

    我有一些这样的代码 CMD cat lt
  • 我的领域路径定义的 #if TARGET_OS_SIMULATOR 代码有什么问题?

    我有这个代码 if TARGET OS SIMULATOR let device false let RealmDB try Realm path Users Admin Desktop realm Realm realm else let
  • 检索 CSS 是否需要“getPropertyValue”方法?

    你能告诉我为什么我们需要使用getPropertyValue方法 如果我们只能使用getComputedStyle one 例如 据我了解 这将起作用 var s getComputedStyle element null opacity
  • 错误! “sudo”不是 Play 的有效属性

    我有一个 ansible 播放文件 它必须执行两个任务 第一个任务是在本地计算机上获取磁盘使用情况 另一个任务是获取远程计算机的磁盘使用情况并在远程计算机中安装 apache2 当我尝试运行该文件时出现错误 错误 sudo 不是 Play
  • 带有 json 正文的 Swagger POST

    我正在尝试使用 swagger 编写服务器响应的静态 json 文件 我被帖子正文困住了 不知道如何描述它 它看起来与 Grooveshark api 非常相似 其中有一个页面和不同的帖子参数 因此 给出grooveshark的例子 htt
  • 对 CollectionViewSource 感到困惑(SelectedItem 无法在组合中工作)

    我有一堆组合 它们都共享相同的可用选项 这些选择在我的 ViewModel 公开的集合中提供 一切都很好 花花公子 我现在想要对这些选择进行排序 所以我决定公开一个ICollectionView来自我的 ViewModel 而不是我平常的R
  • 将 plupload 与 MVC3 结合使用

    因此 我在 MVC3 中使用 flash 运行时实现了 plupload 它工作完美 因为它使用更正操作上传并运行全部内容 但是 我真的很希望能够控制响应 并在 plupload 中处理它 但我似乎无法得到任何响应 我尝试过覆盖 fileU
  • ambari hadoop 安装期间权限被拒绝(publickey、gssapi-keyex、gssapi-with-mic、密码)

    我正在尝试使用 ambari 部署 hadoop 集群 但是当我选择具有 FQDN 的主机名并继续配置时 我收到 ssh 的权限被拒绝错误 脚步 1 使用 ssh keygen 作为 root 生成 rsa 密钥 更改了 ssh 700 和
  • 我什么时候会使用 AppDomain?

    我对反射相当陌生 我想知道我会使用 第二个 AppDomain 做什么 在商业应用中会有什么实际应用 有很多用途 辅助 AppDomain 可以提供一定程度的隔离 类似于操作系统提供的进程隔离 我使用它的一个实际用途是动态加载 插件 DLL
  • 如何在android中将url加载到webview时显示进度?

    我正在将 url 加载到 webview 中 WebView webview WebView findViewById R id webview webview loadUrl url 加载网址需要一些时间 在此期间显示空白屏幕 我想在加载
  • 递归查询挑战 - 简单的父/子示例

    注意 在 postgresql 上的 RhodiumToad 的帮助下 我找到了一个解决方案 我将其作为答案发布 如果有人可以对此进行改进 请加入 我还没能适应之前的递归查询解决方案到以下有向无环图 其中包括多个 根 无祖先 节点 我正在尝