使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例
前言:开发常用的关系型数据库MySQL,mssql,postgre,Oracle,简单的增删改查的SQL语句都与标准SQL兼容,这个不用讲,那么对于迭代查询(不严格的叫法:递归查询)每种数据库都不一样,对于标准SQL语句支持最好的是mssql和postgre,这个不需多讲,我们只讲讲单表情况下的postgre如何通过迭代查询获取有层级关系的数据。
一、表结构举例
MENU表
ID VARCHAR2(32) N sys_guid() 节点id
FENXID
VARCHAR2(32) Y 分项id
FENXMC
VARCHAR2(100) Y 分项名称
FUJID
VARCHAR2(32) Y 父级id
FUJMC
VARCHAR2(100) Y 父级名称
二、关联关系
子级菜单的FUJID等于父级菜单的FENXID,根节点没有FUJID,每个节点都有一个节点ID用于方便单个节点增删改查
即((根节点,根节点无FUJID)ID,FENXID-->FUJID,FENXID(具有子级的父节点,该FUJD等于上一级的FENXID)-->FUJID,FENXID-->FUJID,FENXID-->FUJID,FENXID....以此类推)
三、迭代查询
(1)不限层级查询
WITH RECURSIVE locs(ID,FENXID,FENXMC,FUJID,FUJMC)
AS
(
SELECT a.ID,a.FENXID,a.FENXMC,a.FUJID,a.FUJMC,0 AS loclevel FROM menu a
where a.id='12345678000000000000'
UNION ALL
SELECT a.ID,a.FENXID,a.FENXMC,a.FUJID,a.FUJMC,loclevel+1 FROM menu a
INNER JOIN locs p ON a.fujid=p.fenxid
)
SELECT * FROM locs
查询结果的每条数据会带一个loclevel字段,该字段表示层级
(2)限制层级数量查询
比如,我们只需要查询到第三级菜单,在上面的SQL语句中增加一个loclevel<3的条件:
WITH RECURSIVE locs(ID,FENXID,FENXMC,FUJID,FUJMC)
AS
(
SELECT a.ID,a.FENXID,a.FENXMC,a.FUJID,a.FUJMC,0 AS loclevel FROM menu a
where a.id='12345678000000000000'
UNION ALL
SELECT a.ID,a.FENXID,a.FENXMC,a.FUJID,a.FUJMC,loclevel+1 FROM menu a
INNER JOIN locs p ON a.fujid=p.fenxid and loclevel<3
)
SELECT * FROM locs
使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例的更多相关文章
- 使用Oracle数据库实现树形结构表的子-父级迭代(递归)查询和删除,通过级联菜单简单举例
前言: 我们在开发中,常常遇到单表的子-父id级联的表结构,在树形的深度不确定的情况下,一次查询出某个树形结构下的所有具有子-父级关系的数据变得十分困难. 这时,我们使用oracle提供的CONNEC ...
- 使用Oracle数据库实现树形结构表的子-父级递归查询和删除,通过级联菜单简单举例
前言: 我们在开发中,常常遇到单表的子-父id级联的表结构,在树形的深度不确定的情况下,一次查询出某个树形结构下的所有具有子-父级关系的数据变得十分困难. 这时,我们使用oracle提供的CONNEC ...
- Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结
Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结 1. 数据结构( 树形结构,表形数据,对象结构 ) 1 2. 编程语言中对应的数据结构 jav ...
- 「SQL归纳」树形结构表的存储与查询功能的实现——通过路径方法(非递归)
一.树形结构例子分析: 以360问答页面为例:http://wenda.so.com/c/ 我们通过观察URL,可以明确该页面的数据以树形结构存储,下面三块模块分别为: ①根节点 ②根节点的第一层子节 ...
- 树形结构表的存储【转自:http://www.cnblogs.com/huangfox/archive/2012/04/11/2442408.html】
在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系.在传统的关系型数据库中,就已经产生了各种解决方案. 此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型 ...
- element中的树形组件,如何获取父级菜单的id
一般多选的树形组件,使用getCheckedNodes()方法只能获取到本级的菜单id,只有在子菜单全部选中的情况下才会选中上级.但我们想要不全选中子级的情况下也要获取它的上级,甚至上上级等,怎么办呢 ...
- sqlserver 树形结构表查询 获取拼接结果
树形表结构如下 IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[Test]') AND ty ...
- mysql中树形结构表的操作
一种是:邻接表模型(局限性:对于层次结构中的每个级别,您需要一个自联接,并且随着连接的复杂性增加,每个级别的性能自然会降低.在纯SQL中使用邻接列表模型充其量是困难的.在能够看到类别的完整路径之前,我 ...
- 关系型数据库的树形结构查询(Oracle、Postgres)
Oracle : start with… connect by 的用法.语法:select * from table [where 条件1] connect by[条件2] start with[条件 ...
随机推荐
- 在ASP.NET CORE 2.0使用SignalR技术
一.前言 上次讲SignalR还是在<在ASP.NET Core下使用SignalR技术>文章中提到,ASP.NET Core 1.x.x 版本发布中并没有包含SignalR技术和开发计划 ...
- PowerShell使用-debug定位问题
PowerShell就像它的名字一样,很强大,用起来很方便,所以微软基本上所有的主流企业级产品都支持PowerShell,Azure也不例外.通过Azure门户网站固然是简单直观,但对于很多IT管理员 ...
- 最小的 Velocity 教程
工作以后,我越来越能体会到80/20法则的强大. 这是一个不可否认的事实,常用 20% 的技术可以解决工作中 80% 的场景. 所以我希望能介绍给你 Velocity 技术 20%,帮助你胜任 80% ...
- Eclipse中常用快捷键
Ctrl+C:复制. Ctrl+V:粘贴. Ctrl+X:剪切. Ctrl+S:保存. Ctrl+Z:撤销. Ctrl+A:全选. F3:快速定位光标位置的某个类.方法和属性. Ctrl+Q:跳到最后 ...
- 开发servlet三种方式
第一种:实现Servlet接口 ServletDemo类 实现Servlet接口 public class ServletDemo implements Servlet { //初始化该servlet ...
- redhat Redis的安装和部署
1. 拥有Redis压缩包,地址:http://redis.io/download 我的是3.07 2. 解压包和创建redis安装目录 tar -zxvf XXX mkd ...
- 【.net 深呼吸】自己动手来写应用程序设置类
在开始装逼之前,老周先说明一件事.有人说老周写的东西太简单了,能不能写点复杂点.这问题就来了,要写什么东西才叫“复杂”?最重要的是,写得太复杂了,一方面很多朋友看不懂,另一方面,连老周自己也不知道怎么 ...
- 【NOIP模拟】Grid(字符串哈希)
题目背景 SOURCE:NOIP2016-RZZ-1 T3 题目描述 有一个 2×N 的矩阵,矩阵的每个位置上都是一个英文小写字符. 现在需要从某一个位置开始,每次可以移动到一个没有到过的相邻位置,即 ...
- laravel数据库查询返回的数据形式
版本:laravel5.4+ 问题描述:laravel数据库查询返回的数据不是单纯的数组形式,而是数组与类似stdClass Object这种对象的结合体,即使在查询构造器中调用了toArray(), ...
- mysql浅龟定
一,尽量不字啊数据库做运算 1,尽量不再数据库做运算, 2,将复杂运算移动到cpu 3,尽可能简单应用mysql 二,控制表数据量 1,纯 int不超过1000w 2,含char不超过500w 3,建 ...