递归函数WITH RECURSIVE语法
WITH RECURSIVE cte_name (column_list) AS (
SELECT initial_query_result
UNION [ALL]
SELECT recursive_query
FROM cte_name
WHERE condition
)
SELECT * FROM cte_name;
WITH RECURSIVE 关键字:表示要使用递归查询的方式处理数据。
cte_name:给这个临时的递归表取个名字,可以在初始查询和递归查询中引用。
column_list:表示cte_name查询表中包含的列名,列名之间用逗号分隔。
initial_query_result:表示初始的查询结果,应该与column_list中的列名对应。
UNION:表示将两个查询结果集进行联合,使用UNION ALL则表示保留重复数据。
recursive_query:表示递归查询语句,应当与column_list中的列名对应。
condition:表示递归查询的终止条件,需要使用cte_name中的列进行判断。
SELECT * FROM cte_name:
表示最终返回的查询结果集,可以通过cte_name查询 临时递归表 中的列名进行指定。
例子
表:gc_jzst_single_base
需求:要求返回这张表里符合条件的数据,且有父子级关系的,展示为同一组且分级,给后续业务调用
代码
WITH RECURSIVE t1 AS (
SELECT
single_id,
old_build_single_id,
single_name,
bulid_code,
1 AS LEVEL,
single_id groupFlag
FROM
gc_jzst_single_base
WHERE
single_assort = '1'
AND build_status != '0'
AND single_type = 'DWGC_DTLX_0802'
AND old_build_single_id IS NULL UNION ALL
SELECT
b.single_id,
b.old_build_single_id,
b.single_name,
b.bulid_code,
t1.LEVEL + 1,
t1.groupFlag
FROM
gc_jzst_single_base b
JOIN t1
WHERE
b.old_build_single_id = t1.single_id
AND b.single_assort = '1'
AND b.build_status != '0'
AND b.single_type = 'DWGC_DTLX_0802'
AND b.old_build_single_id IS NOT NULL
) -- 终止条件部分
SELECT
*
FROM
t1
ORDER BY
groupFlag;
结果:满足条件