SQL 递归查询通常是通过 CTE(Common Table Expression,公用表表达式) 配合 WITH RECURSIVE 实现的,主要用于处理树形结构、层级关系、图结构等数据。
下面用最常见的关系型数据库(如 MySQL 8+、PostgreSQL、SQL Server)来说明。
WITH RECURSIVE cte_name AS (
-- 1. 初始查询(锚点)
SELECT ...
FROM table
WHERE 条件
UNION [ALL]
-- 2. 递归查询
SELECT ...
FROM table
JOIN cte_name ON 连接条件
)
SELECT * FROM cte_name;
employee (
id INT,
name VARCHAR(50),
manager_id INT
)
WITH RECURSIVE sub_tree AS (
-- 起始节点(比如 id = 1 的老板)
SELECT id, name, manager_id
FROM employee
WHERE id = 1
UNION ALL
-- 递归查找下属
SELECT e.id, e.name, e.manager_id
FROM employee e
JOIN sub_tree s ON e.manager_id = s.id
)
SELECT * FROM sub_tree;
WITH RECURSIVE parent_tree AS (
SELECT id, name, manager_id
FROM employee
WHERE id = 10 -- 某个员工
UNION ALL
SELECT e.id, e.name, e.manager_id
FROM employee e
JOIN parent_tree p ON e.id = p.manager_id
)
SELECT * FROM parent_tree;
WITH RECURSIVE tree AS (
SELECT id, name, manager_id, 1 AS level
FROM employee
WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id, t.level + 1
FROM employee e
JOIN tree t ON e.manager_id = t.id
)
SELECT * FROM tree;
UNION ALL(效率高)
UNION 会去重,性能差RECURSIVE)CONNECT BY)SELECT id, name, manager_id
FROM employee
START WITH id = 1
CONNECT BY PRIOR id = manager_id;
如果你有具体的业务场景(菜单、分类、组织、评论)或使用的数据库类型,我可以给你更贴合的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。