背景描述
自引用类型的表结构处理起来比较麻烦,比如“分类”表,通常包括自己的ID和父分类ID,当我们要做父分类路径、子分类路径之类的查询时很不方便,例如我们会使用嵌套查询,或者添加冗余字段来记录分类路径信息,都比较麻烦,有没有简单的办法呢?
解决方法就是使用CTE(Common Table Expression),通用表表达式。
下面我们先认识一下CTE,然后通过几个实际查询示例来深入理解,最后会提供测试数据,以方便自己动手实践(在mysql8和postgres10上都测试过)。
什么是 CTE?
各大主流数据库都支持CTE,mysql8 中也支持了。
简单理解,CTE 就是一个有名字的结果集,就像一个普通表一样,可以被用在 select 语句中。
CTE 有循环和非循环形式,非循环形式比较简单,就像一个命了名的子查询,例如:
循环形式的复杂一点,先看一个示例:
(1)示例1
查询 “Child A1” 这个分类及其子分类,并显示层级深度。
分析:
第一个select得到结果数据 和 基础上计算
和 的2个子分类 ,还有 和 查找,找到了 。
第二个 select 继续执行,发现结果集为空了,停止。
测试环境准备
建表:
领取专属 10元无门槛券
私享最新 技术干货