在 SQL 中,遞歸函數(shù)通常使用遞歸公共表表達(dá)式(Recursive Common Table Expressions,簡稱 CTE)來實(shí)現(xiàn)
WITH RECURSIVE cte_name (column1, column2, ..., columnN) AS (
-- 基本查詢(Base case)
base_query
UNION ALL
-- 遞歸查詢(Recursive case)
recursive_query
)
SELECT * FROM cte_name;
其中:
WITH RECURSIVE
關(guān)鍵字用于定義一個(gè)遞歸 CTE。cte_name
是 CTE 的名稱,可以根據(jù)需要自定義。(column1, column2, ..., columnN)
是 CTE 的列名,需要與查詢結(jié)果的列名相匹配。base_query
是基本查詢,用于返回遞歸的起始數(shù)據(jù)。這部分查詢不能引用 CTE 本身。recursive_query
是遞歸查詢,它引用了 CTE 本身,并且必須使用 UNION ALL
與基本查詢組合。遞歸查詢會(huì)不斷地應(yīng)用到 CTE 上,直到?jīng)]有新的行產(chǎn)生為止。下面是一個(gè)簡單的遞歸 CTE 示例,用于計(jì)算階乘:
WITH RECURSIVE factorial_cte (n, result) AS (
-- 基本查詢
SELECT 0, 1
UNION ALL
-- 遞歸查詢
SELECT n + 1, result * (n + 1)
FROM factorial_cte
WHERE n < 5
)
SELECT * FROM factorial_cte;
這個(gè)查詢將計(jì)算 0 到 5 的階乘。