数仓(Data Warehouse)中,SQL递归函数的使用场景多出现在需要处理具有层级或树状结构的数据时。这类数据可能包括商品分类、用户行为路径(如点击流中的页面跳转)、促销活动层级等。
下面将以商品分类为例,来举例一个SQL递归函数的使用场景。
假设你有一个电商平台的商品分类表category,表中包含id(分类ID)、name(分类名称)和parent_id(父分类ID)等字段。根分类的parent_id通常为NULL或某个特定的值(如0),表示它没有父分类。现在,你需要查询出某个分类及其所有子分类的层级结构。
sql
CREATE TABLE category (
id INT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES category(id)
);
sql
INSERT INTO category (id, name, parent_id) VALUES
(1, '电子产品', NULL),
(2, '手机', 1),
(3, 'iPhone', 2),
(4, 'Android', 2),
(5, '电脑', 1),
(6, '笔记本电脑', 5),
(7, '台式机', 5);
SQL递归查询
在这个场景中,你可以使用SQL的WITH RECURSIVE语句来构建递归查询,以获取某个分类及其所有子分类的层级结构。
sql
WITH RECURSIVE CategoryPath AS (
-- 初始查询,选取根分类或指定分类
SELECT id, name, parent_id, 0 AS level
FROM category
WHERE id = 1 -- 假设我们从电子产品分类开始
UNION ALL
-- 递归查询,选取当前分类的所有子分类
SELECT c.id, c.name, c.parent_id, cp.level + 1
FROM category c
INNER JOIN CategoryPath cp ON c.parent_id = cp.id
)
SELECT * FROM CategoryPath
ORDER BY level, id;
这个查询首先定义了一个名为CategoryPath的递归公用表表达式(CTE)。在CTE中,初始查询选出了根分类(或你指定的任何分类),然后递归查询选出了所有子分类,并通过level字段来跟踪分类的层级。最后,查询返回了从指定分类开始的所有分类及其层级信息,按层级和ID排序。