数开中:SQL递归函数使用场景(70天)

数仓(Data Warehouse)中,SQL递归函数的使用场景多出现在需要处理具有层级或树状结构的数据时。这类数据可能包括商品分类、用户行为路径(如点击流中的页面跳转)、促销活动层级等。
下面将以商品分类为例,来举例一个SQL递归函数的使用场景。

1. 场景描述

假设你有一个电商平台的商品分类表category,表中包含id(分类ID)、name(分类名称)和parent_id(父分类ID)等字段。根分类的parent_id通常为NULL或某个特定的值(如0),表示它没有父分类。现在,你需要查询出某个分类及其所有子分类的层级结构。

2. 示例表结构

sql

CREATE TABLE category (  
    id INT PRIMARY KEY,  
    name VARCHAR(255) NOT NULL,  
    parent_id INT,  
    FOREIGN KEY (parent_id) REFERENCES category(id)  
);

3. 示例数据

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排序。

这样,就可以清晰地看到每个分类及其所有子分类的层级结构。
在这里插入图片描述

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老爹@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值