SQL递归(用with 实现递归查询)
程序员文章站
2024-02-11 19:35:46
...
一、SQL递归查询
1、基本概念
1、公用表表达式 (CTE) 可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW
2、语句的执行范围内定义的临时结果集。公用表表达式可以包括对自身的引用,这种表达式称为递归公用表表达式。
3 、递归 CTE 最少包含两个查询(也被成为成员)
4、第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点。
5、第二个查询被成为递归成员,使该成员称为递归成员的是对 CTE 名称的递归引用是触发。在逻辑上可以将 CTE 名称的内部应用理解为前一个查询的结果集。
6、递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果集或超出了递归次数的最大限制时才停止递归,是指递归次数上限的方法是使用MAXRECURION
① 创建递归查询。有关详细信息,请参阅 使用公用表表达式的递归查询
② 在不需要常规使用视图时替换视图,也就是说,不必将定义存储在元数据中。
③ 启用按从标量嵌套 select 语句派生的列进行分组,或者按不确定性函数或有外部访问的 函数进行分组。
④ 在同一语句中多次引用生成的表。
CTE 的基本语法结构如下:
with expression_name [( cloumn_name [,...n])]
as
(CTE_query_definition)
//只能在查询定义中为所有的结果都提供了不同的名称时,列名称列表才是可选的。
//运行CTE的语句为:
select <column_list> from expression_name;
即三个部分:
- 共用表表达式的名称(with关键字之后)
- 查询的列名(可选)
- 紧跟 as 之后的 select 语句(如果AS之后有多个对公用表的查询,则只有第一个查询有效)
2、动手实践
根据菜单根节点查询所有子菜单数据 pid 为参数
[FParentID] = 0 如图 根节点菜单数据
执行上图递归语句 得到<质量站点>下的所有子菜单数据