网站备案正常多久,专业网站建设微信官网开发,网站怎么添加百度地图,网站建设制作博走SQL 递归 ---- WITH RECURSIVE 的用法
开发中遇到了一个需求#xff0c;传递一个父类id#xff0c;获取父类的信息#xff0c;同时获取其所有子类的信息。 首先想到的是通过程序中去递归查#xff0c;但这种方法着实孬了一点#xff0c;于是想#xff0c;sql能不能递归查…SQL 递归 ---- WITH RECURSIVE 的用法
开发中遇到了一个需求传递一个父类id获取父类的信息同时获取其所有子类的信息。 首先想到的是通过程序中去递归查但这种方法着实孬了一点于是想sql能不能递归查询呢 这不一查发现还真能一 、说明
WITH RECURSIVE 是 SQL 中的一个强大特性通常用于处理递归查询常见于 PostgreSQL、MySQL 8.0 及以上、SQL Server 等数据库系统。它允许你在一个查询中引用其自身的结果集这对于处理具有层次结构的数据如树状结构或图结构非常有用。
二、 语法
WITH RECURSIVE tmp_table (column_list) AS (-- 初始查询非递归部分initial_queryUNION (ALL)-- 递归查询部分recursive_query
)
SELECT * FROM tmp_table;WITH RECURSIVE递归关键字tmp_table可以理解为一个临时表column_list定义 结果集中的列列表也可省略initial_query初始查询它是递归的基础通常是一个非递归的查询为递归查询提供起始数据。UNION ALL将初始查询和递归查询的结果集合并。注意使用 UNION ALL 是为了保留重复行而 UNION 会去除重复行。recursive_query递归查询部分会引用 tmp_table 自身的结果集。
三、 举例说明 建表初始化一部分数据 (数据库环境 MYSQL 8.0 以上) CREATE TABLE geographic_info (id int NOT NULL AUTO_INCREMENT COMMENT 自增编号,name varchar(20) NOT NULL COMMENT 名称,parent_id int NULL COMMENT 父节点id,PRIMARY KEY (id)
) COMMENT地理信息表;-- init data
insert into geographic_info(id,name,parent_id) value (1,安徽省,null);
insert into geographic_info(id,name,parent_id) value (2,合肥市,1);
insert into geographic_info(id,name,parent_id) value (3,高新区,2);
insert into geographic_info(id,name,parent_id) value (4,某某小区,3);创建递归查询 -- 自下而上进行递归
-- 通过某某小区的id查询出其父类及以上层级的数据
WITH RECURSIVE descendants AS (SELECT gi.id, gi.name,gi.parent_id from geographic_info giWHERE gi.id 4UNION SELECT gi.id, gi.name,gi.parent_id from geographic_info gi join descendants d on gi.id d.parent_id
)
SELECT * FROM descendants order by id;返回数据 -- 自上而下进行递归
-- 通过安徽省的id查询出其所有子类的数据注此处不合理查询请忽略仅仅为了举例
WITH RECURSIVE descendants AS (SELECT gi.id, gi.name from geographic_info giWHERE gi.id 1UNION SELECT gi.id, gi.name from geographic_info gi
join descendants d on gi.parent_id d.id
)
SELECT * FROM descendants order by id; 返回数据
四、注意事项
终止条件 递归最需要关注的地方就是终止条件处理不当就会导致无限递归。性能对于深度较大的树结构或图结构递归查询可能会影响性能。在某些情况下使用其他存储方式如闭包表可能会更高效数据库支持并非所有数据库都支持 WITH RECURSIVE。例如MySQL 从 8.0 开始支持而一些较旧的版本不支持使用前请确认你的数据库是否支持。
五、写在最后
数据库递归的用法也是第一次学习文章可能存在错误之处还请指出我们共同进步
文章如果对您有用就点个赞呗。 较旧的版本不支持使用前请确认你的数据库是否支持。
五、写在最后
数据库递归的用法也是第一次学习文章可能存在错误之处还请指出我们共同进步
文章如果对您有用就点个赞呗。