通用表表达式(CTE,COMMON TABLE EXPRESSION)
通用表表达式(CTE)是标准的SQL语法,本质上是临时命名的结果集。CTE最初于1999年出现在SQL标准(即所谓的SQL-99标准),然而第一个实现好像是在出现在2007年的SQL Server 2008
SQL通常在面向过程的递归结构方面支持较弱,CTE允许查询引用自身。递归CTE将重复执行数据的子集,直到获得完整的结果集。这对于处理分层或树状数据特别有用。
目前主流数据库平台都已支持CTE语法,只是在数据类型和函数等细节方面存在细微差异,影响不大。国产的达梦数据库从7.0开始也支持了CTE语法,点赞!
按照SQL标准写,就是舒服,建议使用符合标准SQL,而非方言。
SQL Server
-- 递归所有下级
WITH --RECURSIVE cte1 AS ( SELECT g.* , cast (g.name_chs as varchar(1000)) as full_name , (ROW_NUMBER() over(order by g.sortorder)) * POWER(10, 5) as order_num , 5 as levelId from gspfunc g where g.id = 'HIP' UNION ALL SELECT g.* , cast(cte1.full_name + '-' + g.name_chs as varchar(1000)) as full_name , order_num + (ROW_NUMBER() over(order by g.sortorder) * POWER(10, levelid-1)) as order_num , levelid - 1 as levelid FROM cte1 join gspfunc g ON g.parentid = cte1.id ) SELECT id, code, name_chs, full_name, path, order_num, levelid , * FROM cte1 order by cte1.order_num; -- 递归找上级 WITH --RECURSIVE cte1 AS ( SELECT g.*, cast (g.name_chs as varchar(1000)) as full_name FROM gspfunc g WHERE g.code = 'service-status-monitor' UNION ALL SELECT g.*, cast(cte1.full_name + '-' + g.name_chs as varchar(1000)) as full_name FROM cte1 join gspfunc g ON g.id = cte1.parentid ) SELECT id, code, name_chs, full_name , path, * FROM cte1 ORDER BY cte1.full_name;
Oracle、DM
WITH --RECURSIVE cte1(id, code, name_chs, parentid, full_name) AS ( SELECT g.id, g.CODE , g.NAME_CHS , g.PARENTID , cast (g.name_chs as varchar(1000)) as full_name from gspfunc g where g.id = 'HIP' UNION ALL SELECT g.id, g.CODE, g.NAME_CHS , g.PARENTID , cast(cte1.full_name || '-' || g.name_chs as varchar(1000)) as full_name FROM cte1 join gspfunc g ON g.parentid = cte1.id ) SELECT id, code, name_chs, PARENTID , full_name FROM cte1 ORDER BY cte1.full_name;
MySQL
WITH RECURSIVE cte1 AS ( SELECT g.id, g.CODE , g.NAME_CHS , g.PARENTID , cast(g.name_chs as char(1000)) as full_name from gspfunc g where g.id = 'HIP' UNION ALL SELECT g.id, g.CODE, g.NAME_CHS , g.PARENTID , CONCAT(cte1.full_name , '-' , g.name_chs) as full_name FROM cte1 join gspfunc g ON g.parentid = cte1.id ) SELECT id, code, name_chs, PARENTID, full_name FROM cte1 ORDER BY cte1.full_name;
PostgreSQL
WITH RECURSIVE cte1 AS ( SELECT g.id, g.CODE , g.NAME_CHS , g.PARENTID , cast(g.name_chs as varchar(1000)) as full_name from gspfunc g where g.id = 'HIP' UNION ALL SELECT g.id, g.CODE, g.NAME_CHS , g.PARENTID , cast(cte1.full_name || '-' || g.name_chs as varchar(1000)) as full_name FROM cte1 join gspfunc g ON g.parentid = cte1.id ) SELECT id, code, name_chs, PARENTID, full_name FROM cte1 ORDER BY cte1.full_name;
标签:
SQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2007-11-01 制作批处理文件,执行补丁升级