首页 / 知识
关于postgresql:是否可以进行递归SQL查询?
2023-04-14 18:30:00

Is it possible to make a recursive SQL query?我有一张与此类似的表:
我可以使用parentid字段将数据排列成树状结构。 现在这是我无法解决的问题。给定一个parentid,是否有可能编写一条SQL语句来添加该parentid下的所有值字段并向下递归该树的分支? 更新:我正在使用posgreSQL,因此无法使用精美的MS-SQL功能。无论如何,我希望将其视为通用SQL问题。 顺便说一句,我很高兴在提出问题的15分钟内能得到6个答案!去堆栈溢出! 以下是使用公用表表达式的示例脚本:
上面的脚本创建一个名为 第一个 第二个 然后可以像正常表一样处理最终结果。在这种情况下,将对val列求和。 从8.4版开始,PostgreSQL使用SQL标准 如果您想使用可在任何ANSI SQL-92 RDBMS上使用的便携式解决方案,则需要在表中添加一个新列。 Joe Celko是嵌套集方法在SQL中存储层次结构的原始作者。您可以使用Google"嵌套集"层次结构来了解有关背景的更多信息。 或者您可以将parentid重命名为leftid并添加一个rightid。 这是我尝试对嵌套集进行总结,因为我不是Joe Celko,嵌套集将严重不足:SQL是基于集合的语言,而邻接模型(存储父ID)不是基于集合的表示形式层次结构。因此,没有用于查询邻接模式的纯基于集合的方法。 但是,近年来,大多数主要平台都引入了扩展,以解决这一精确问题。因此,如果有人回复了Postgres特定的解决方案,请务必使用它。 在PostgreSQL中有几种方法可以满足您的需求。
类似这样的内容:
在 在早期版本中,您可以编写递归集返回函数:
查看本文:
如果您使用的是SQL Server 2005,则可以使用"公用表表达式"来实现此目的。 从创建临时表中消除了所有繁琐的工作,并且基本上允许您仅使用WITH和UNION来完成所有工作。 这是一个很好的教程: http://searchwindevelopment.techtarget.com/tip/0,289483,sid8_gci1278207,00.html 使用公用表表达式。
这是有关SqlTeam没有通用表表达式的递归的文章。 下面的代码可以编译,并且已经过测试。
在我的情况下,条件"子代<>父代"是必需的,因为节点指向自己。 玩得开心:) 这些示例都无法为我工作,因此我已将其修复为:
尽管问题已得到很好的回答,但作为简短说明,应该注意的是,如果我们将其视为:
然后,SQL实现相当简单,因为SQL'99允许通过 Oracle具有" START WITH"和" CONNECT BY"
http://www.adp-gmbh.ch/ora/sql/connect_by.html 我认为使用HierarchyID 在SQL 2008中更容易 这是SQL Server吗?您是否可以编写一个TSQL存储过程来循环并将结果合并在一起? 我也很感兴趣是否有一种仅使用SQL的方式来执行此操作。从我记得的地理数据库类的资料来看,应该有。 如果您需要存储任意图形,而不仅仅是层次结构,则可以将Postgres推到一边,然后尝试使用诸如AllegroGraph: 的图形数据库 图形数据库中的所有内容都存储为三元组(源节点,边,目标节点),它为您提供了一流的支持,可操纵图形结构并使用类似SQL的语言对其进行查询。 它不能与Hibernate或Django ORM之类的东西很好地集成在一起,但是如果您对图结构很认真(不仅像Nested Set模型这样的层次结构会给您),请检查一下它。 我也相信Oracle终于在其最新产品中增加了对真实图的支持,但是我很惊讶它花了这么长时间,该模型可能会带来很多问题。 |
最新内容
相关内容
linux查询网关命令?
linux查询网关命令?,网络,信息,地址,环境,系统,网关,名字,中心,状态,命令,linux怎么查看网关1、打开终端窗口。输入以下命令并按下回车键 rout类似linux的命令编辑?
类似linux的命令编辑?,环境,地址,命令,状态,工作,信息,情况,文件,目录,编辑,windows下类似linux下grep搜索命令1、findstr是window系统自带的linux命令查询参数?
linux命令查询参数?,网络,信息,设备,系统,服务,状态,情况,工作,地址,命令,Linux常用命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出目linux查询硬盘命令行?
linux查询硬盘命令行?,情况,系统,信息,工具,单位,软件,命令,服务,电脑,分析,命令查看Linux服务器内存、CPU、显卡、硬盘使用情况Linux命令行可linux查询分辨率命令?
linux查询分辨率命令?,情况,设备,系统,分辨率,数据,命令,屏幕,屏幕分辨率,桌面,终端,linux下怎么通过命令改分辨率1、使用xrandr查询,带“*”的linux中递归压缩命令?
linux中递归压缩命令?,系统,工作,命令,工具,管理,信息,设备,文件,目录,常用命令,Linux第二章-Linux常用命令1、linux常用命令有pwd命令、cd命linux常用命令查询?
linux常用命令查询?,工作,地址,系统,信息,命令,目录,管理,标准,常用命令,控制台,linux常用命令linux系统常用操作命令如下:ls:全拼list,功能是列linux命令查询汉语?
linux命令查询汉语?,工作,地址,系统,信息,命令,目录,标准,状态,软件,亚洲,基本linux命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出目linux下查询历史命令?
linux下查询历史命令?,地址,信息,系统,服务,数据,连续,命令,数字,名称,环境,linux下学习history命令的用法实例使用 HISTCONTROL 从命令历史中linux查询表结构命令?
linux查询表结构命令?,系统,标准,信息,数据,地址,设备,时间,适当,软件,命令,linux下怎么用tree命令以树形结构显示文件目录结构1、以Ubuntu为linux网络命令查询?
linux网络命令查询?,信息,网络,系统,地址,工作,状态,技术,电脑,命令,设备,linux查看系统网卡信息命令?方法一:ethtool eth0 采用此命令可以查看linux查询子目录命令?
linux查询子目录命令?,信息,系统,命令,名称,文件,名字,管理,软件,灵活,工具,Linux下Grep命令的详细使用方法?1、查找root目录下包含Linux的文