如何在PostgreSQL中选择具有级别的表的所有层次结构

2024-06-28

我现在有一个问题。 我有一个名为地方的表,其结构如下:

  • id
  • 父 ID
  • name

我想做一个选择来拥有该表的所有层次结构。有一个数据的小例子:

(1, null, '123 Barclay St')
(2, 1, 'Floor 1')
(3, 1, 'Floor 2')
(4, 1, 'Floor 3')
(5, 2, 'Hall 1')
(6, 2, 'Room 1')
(7, 2, 'Room 2')
(8, 3, 'Room 3')
(9, null, '10 Thames St')

显然表中的顺序不是这个。

所以我想用我的 SELECT 得到这个结果(有 9 行):

123 Barclay St
   Floor 1
      Hall 1
      Room 1
      Room 2
   Floor 2
      Room 3
   Floor 3
10 Thames St

而不是这个结果(我已经知道如何得到):

10 Thames St
123 Barclay St
   Floor 1
   Floor 2
   Floor 3
      Hall 1
      Room 1
      Room 2
      Room 3

如果您能帮助我,我提前感谢您。


这是使用递归 CTE 的解决方案:

WITH RECURSIVE cte AS (
    SELECT LPAD(id::text, 3, '0') AS marker, '   ' AS buffer,
        id, parent_id, name::text
    FROM yourTable t WHERE parent_id IS NULL
    FROM yourTable t WHERE parent_id IS NULL
    UNION ALL
        SELECT t2.marker || ':' || LPAD(t1.parent_id::text, 3, '0') || ':' ||
            LPAD(t1.id::text, 3, '0') AS marker,
            t2.buffer || '   ', t1.id, t1.parent_id, t2.buffer || t1.name
    FROM yourTable t1
    INNER JOIN cte t2
        ON t1.parent_id = t2.id
)

SELECT name FROM cte ORDER BY marker;

Demo http://rextester.com/KDD54033

这里的基本思想是构建路径字符串,跟踪从每个节点返回其根的完整路径(根由其节点给出)parent_id is NULL)。然后,我们只需做一个ORDER BY在此路径上生成您想要的订单。

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

如何在PostgreSQL中选择具有级别的表的所有层次结构 的相关文章

  • 在 CodeIgniter、SQL 中调用布尔值的成员函数 result()

    我试图根据搜索关键字查看 data results 中有哪些数据 但每次都会出现上述致命错误 有人可以帮助我吗 我的控制器 public function execute search search term this gt input g
  • Sql Server 2008 强制日期从 dd/MM/yyyy 到 MM/dd/yyyy

    我在 sql server 2008 上遇到了一个奇怪的问题 我试图用dd MM yyyy格式写入sql server 2008 但是插入日期后它会自动转换为MM dd yyyy 注意 我的电脑时钟格式是dd MM yyyy 我的报告查看器
  • 从表变量中获取列的明确名称

    我可以这样声明一个表变量 DECLARE tv source TABLE c1 int providerName varchar 50 providerSMS varchar 50 如果我执行以下命令 我会看到类似于以下内容的表名称 468
  • 数据流任务的 Foreach 循环容器

    我想从 Oracle DB 导入近 1200 万条记录 但由于 SSIS 内存缓冲区问题 我需要每年迭代我的数据流任务 即 2005 年到 2012 年 7 次 我如何使用 foreach 我的 oracle 查询来获取每年的数据 Quer
  • 如何在SQL Server数据库的所有表的所有列中搜索特定字符串?

    我们想要在拥有大约 120 个表的所有数据库中搜索一个字符串 即 Hello World 我们考虑过像 mysql dump 一样进行转储 但它以奇怪的 bak 格式出现 应在每个表的每一列中进行搜索 任何类型的脚本都可以做到这一点 或者这
  • 根据多列删除重复记录

    在我们的系统中 我们每小时从外部数据库进行导入 由于导入脚本中存在错误 现在存在一些重复记录 如果任何记录具有相同的内容 则视为重复 legacy id and company 我可以运行什么代码来查找并删除这些重复项 我正在玩这个 Pro
  • 即使为空也显示值

    我正在使用以下内容显示过去 7 天内添加的产品计数 即使 COUNT 0 我是否可以以某种方式定制查询以显示过去 7 天的所有产品 查询现状 SELECT DAYNAME dateadded DAY COUNT COUNT FROM pro
  • Oracle 中的 if(条件, then, else)

    MySQL MSSQL 有一个简洁的小内联 if 函数 您可以在查询中使用它来检测空值 如下所示 SELECT foo a field AS a field SELECT if foo bar is null 0 foo bar AS ba
  • 通过sql视图向多个表插入数据

    mysql 有没有办法通过视图向多个表插入数据 MySQL 参考手册对于可更新视图是这样说的 一些视图是可更新的 也就是说 您可以在诸如以下的语句中使用它们UPDATE DELETE or INSERT更新基础表的内容 为了使视图可更新 必
  • Grib2 到 PostGIS 栅格——有人让它工作吗?

    我有一个应用程序需要导入美国国家气象局表面分析 这些分析分布为grib2 http en wikipedia org wiki GRIB文件 我想将它们提取到 PostGIS 2 0 栅格中 进行一些计算和建模 并在 GeoServer 中
  • 时态数据库设计,有一些变化(实时行与草稿行)

    我正在考虑实现对象版本控制 同时需要同时拥有活动对象和草稿对象 并且可以利用某人在这方面的经验的见解 因为我开始怀疑是否有可能在没有潜在可怕的黑客攻击的情况下实现这一点 为了示例 我将把它分解为带有标签的帖子 但我的用例更一般 涉及缓慢改变
  • SQL 中WITH 子句的使用指南

    我了解如何使用WITH递归查询子句 但我在理解它的一般用途 功能时遇到问题 例如 以下查询更新一条记录 其 id 是通过使用按时间戳返回第一条记录 id 的子查询来确定的 update global prospect psp set sta
  • SQL Server 2005 将 VARCHAR 转换为 INT 但默认为无效类型

    我的表中有一个 varchar 100 列 其中包含整数 作为字符串 和非整数字符串的混合 例如 dimension varchar 100 5 17 3 Pyramids Western Bypass 15 我怎样才能写一个表达式 例如将
  • 为什么策略的“using”子句用于新行,而“with check”子句则用于更新语句?

    来自 Postgres制定政策 https www postgresql org docs current sql createpolicy html文档 UPDATE 策略接受 USING 表达式和 WITH CHECK 表达式 USIN
  • 缓慢变化的维度 - 什么是 Pure type 6 实现

    我试图理解纯类型 6 SCD 实现WIKI http en wikipedia org wiki Slowly changing dimension主要说了三点 如果维度可能发生变化 每个时间片都有一个类型 2 代理键可能会导致问题 纯 T
  • SQL仅选择列上具有最大值的行[重复]

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 这个问题在这里已经有答案了 我有这个文件表 这里是简化版本 id rev content 1 1 2 1 1 2 1 3 如何
  • 按日期和时间降序排序?

    全部 我想显示特定 id 最后输入的 5 条数据 我的sql查询是 SELECT id name form id DATE updated at as date FROM wp frm items WHERE user id 11 form
  • MS Access - WHERE IN 有效,但 WHERE NOT IN 失败

    我在 MS Access 上有以下查询 简化 SELECT FROM table1 WHERE table1 ID NOT IN SELECT DISTINCT table1id FROM table2 我的问题是它不起作用 但是这两个起作
  • Android 和 Azure 移动服务:使用 invokeAPI 返回记录集

    我正在尝试一些非常简单的事情 我有一个名为 missingvehiclesfrominventoryjob 的自定义 API 它只是从标准 SQL 查询返回记录集 我可以在我的 WinForms 和 Windows Phone 应用程序中轻
  • JavaFX ComboBox - 显示文本但在选择时返回 ID

    我有一个包含机场的数据库表 每个机场都有一个名称和一个 ID 在 JavaFX 中我有一个表单 其中包含ComboBox 组合框需要显示所有机场名称 并且在提交表单时需要将机场的 ID 插入数据库 而不是其名称 但我并没有真正弄清楚解决方案

随机推荐

  • 为什么带有子进程的 Python 线程无法按预期工作?

    我有以下微妙的问题 Python 代码启动两个线程 每个线程创建一个对可执行文件 实际上是用 C 编写的 的子进程调用 第一个可执行文件传递参数 10000 这意味着在退出之前延迟 10 秒 第二个可执行文件类似 但延迟了 20 秒 我观察
  • CryptAcquireContext——未解析的外部

    我正在链接第三方库 Poco C 并从链接器获取以下未解决的符号错误 它似乎无法找到 CryptAcquireContextW CryptReleaseContext 和 CryptGenRandom 根据微软信息在这里 http msdn
  • BoxDecoration 小部件缺少 padding 属性

    The BoxDecoration 类文档 https api flutter dev flutter painting BoxDecoration class html表明这个小部件有一个padding财产 然而 当我将它与此属性一起使用
  • 更改复选框值而不引发事件

    我想更改复选框值而不引发 onCheck 事件 我知道有一些解决方法 例如取消注册 更改值然后重新注册 在事件方法内部基于标志跳过或评估方法语句 或任何其他解决方法 我正在寻找一种更清洁的方法 我知道这是一个旧线程 但给出的答案太麻烦了 我
  • Heroku postgresql 数据库名称

    这是我必须查找 heroku 数据库名称的命令 heroku config grep POSTGRESQL 我得到类似于以下的结果 HEROKU POSTGRESQL NAVY URL postgres wxjwilh t email pr
  • 如何覆盖 DOMParser 上的 node/xmldom errorHandler?

    I use https github com jindw xmldom https github com jindw xmldom并想要检查 XML 文件的解析错误 文档中写道 有必要在 DOMParser 的构造函数上覆盖 locator
  • 如何将 python 中的 wav 转换为 flac?

    我刚刚开始使用 Python 并且正在使用PyAudio and Wave模块从我的麦克风获取声音并将其转换为 wav file 我现在想做的就是转换它 wav to a flac 我已经看到了几种方法来做到这一点 所有这些都涉及安装转换器
  • 验证 PyPI Python 包的完整性

    最近有一些消息传出恶意库已上传到 Python Package Index PyPI 请参阅 PyPI 上的恶意库 https www bleepingcomputer com news security ten malicious lib
  • 是否可以使用字符串键/值对初始化新的 System.Collections.Generic.Dictionary ?

    是否可以创建并初始化System Collections Generic Dictionary http msdn microsoft com en us library 6918612z VS 80 aspx在一条语句中包含字符串键 值对
  • Lisp 随机化并使用两个函数从列表中拉入另一个列表

    好的 我是 lisp 的新手 我已经在这个程序上工作了几天 以了解 lisp 并研究 lisp 的某些部分 例如 cons cdr let funcall 和其他一些部分 我正在尝试创建一台随机分配颜色的糖果机 我已经多次运行这段代码 起初
  • IE 不支持 function.name。

    最近我已经成为了它的忠实粉丝function name财产 例如 我编写了一个用于扩展原型的函数 它的工作方式是 Array give function forEach 这会让你这样做 a b c forEach function 此代码在
  • Boot BroadcastReceiver 在小米设备上不起作用

    我有一个关注者BroadcastReceiver它应该在启动完成后运行 我已经在我的上测试过了小米设备 Redmi 1s 它没有运行 而在其他设备上 例如Samsung它正在按预期运行 public class DeviceBootRece
  • 如何在Jmeter中生成并发用户负载

    我有一个测试 用户将登录并在搜索字段中输入搜索关键字并获得结果 终于退出了 现在我想使用Jmeter测试并发性 这就是我想出的办法 Test plan Thread group Login request Synchronizing Con
  • MySQL 在 Windows 上将数据库文件存储在哪里以及文件的名称是什么?

    我不小心格式化了硬盘并重新安装了 Windows 却忘记备份 MySQL 服务器中的重要数据库 我现在正在尝试使用某些软件来挽救文件 但我不知道要寻找什么 文件存储的路径是什么 文件的名称是什么 我应该查找什么命名约定或文件扩展名 我相信我
  • ORA-01719: OR 或 IN 的操作数中不允许有外连接运算符 (+)

    运行查询时出现错误 ORA 01719 OR 或 IN 的操作数中不允许有外连接运算符 01719 00000 OR 或 IN 的操作数中不允许使用外连接运算符 原因 or 子句中出现外连接 动作 如果A和B是谓词 要得到 A 或B 的效果
  • 使用 Union 或 Join - 哪个更快 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是想知道你是否有一张桌子并且联合起来会比使用联接更有效吗 我确实知道联接创建了更多列 但这更具理论性 联合是否需要像联接那样对另一
  • 复制稀疏文件

    我正在尝试了解 Linux UNIX 低级接口 作为练习 我想编写一个代码 将一个有漏洞的文件复制到一个新文件 同样有漏洞 所以我的问题是 如何从第一个文件读取 而不是直到第一个洞 而是直到文件的最后 如果我没错的话 read 当到达第一个
  • jQuery stopPropagation 气泡向下

    我有一个 div 里面有一个链接 div a href http www lol com Lol a div 单击 div div 应该去某个地方 但是点击孩子 a a 应该去 www lol com 我见过从之前的问题 https sta
  • SQL SERVER - COALESCE() 函数的问题

    我有一个由存储过程包装的 SQL 函数 ALTER FUNCTION dbo GetObjList filterUID int NULL filterSID varchar 32 NULL RETURNS TABLE AS RETURN S
  • 如何在PostgreSQL中选择具有级别的表的所有层次结构

    我现在有一个问题 我有一个名为地方的表 其结构如下 id 父 ID name 我想做一个选择来拥有该表的所有层次结构 有一个数据的小例子 1 null 123 Barclay St 2 1 Floor 1 3 1 Floor 2 4 1 F