记录下:SQL Server 父子迭代查询语句,树状查询

本文提供了一种使用SQL递归公用表表达式(CTE)的方法来查询节点的父级或子级记录。通过两个具体例子展示了如何从指定父节点获取所有子节点以及从指定子节点追溯所有上级节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- Get childs by parent id
WITH Tree
AS
(
    SELECT Id,ParentId FROM dbo.Node P WHERE P.Id = 21 -- parent id
    UNION ALL
    SELECT C.Id,C.ParentId FROM dbo.Node C
    INNER JOIN Tree T ON C.ParentId = T.Id
)
SELECT * FROM Tree

-- Get parents by child id
WITH Tree
AS
(
    SELECT Id,ParentId FROM dbo.Node C WHERE C.Id = 57 -- child id
    UNION ALL
    SELECT P.Id,P.ParentId FROM dbo.Node P
    INNER JOIN Tree T ON P.Id = T.ParentId
)
SELECT * FROM Tree
### MySQL WITH 递归查询 示例教程 #### 使用场景 递归查询适用于处理层次结构数据,如树状结构、链表结构或组织架构等具有父子关系的数据[^3]。 #### 表格创建 为了展示如何使用 `WITH RECURSIVE` 进行递归查询,首先需要建立一个表示节点及其父级关系的表格: ```sql CREATE TABLE treenodes ( id INT PRIMARY KEY, -- 节点ID nodename VARCHAR(60), -- 节点名称 pid INT -- 父节点ID ); ``` #### 插入测试数据 向上述表格中插入一些测试数据以便于后续操作: ```sql INSERT INTO treenodes VALUES (1,'Root',NULL), (2,'Child_1',1), (3,'Child_2',1), (4,'Subchild_1_1',2), (5,'Subchild_1_2',2), (6,'Subchild_2_1',3); ``` #### 编写递归查询语句 下面是一个完整的例子,展示了怎样利用 `WITH RECURSIVE` 来获取指定根节点下的所有子节点信息: ```sql WITH RECURSIVE tree AS ( SELECT id, nodename, pid FROM treenodes WHERE id = 1 -- 初始查询:从根节点开始 UNION ALL -- 并集运算符连接两部分结果 SELECT t.id, t.nodename, t.pid -- 递归查询:加入下一层的孩子们 FROM treenodes t INNER JOIN tree tr ON t.pid = tr.id ) SELECT * FROM tree; ``` 这段 SQL 的工作原理如下: - **初始查询**:选取 ID 为 1 的记录作为起始点; - **递归查询**:对于每一轮迭代,都会尝试找到当前层的所有直接孩子,并将其纳入到结果集中; - 当不再有新的符合条件的记录被发现时,则整个过程结束;此时所有的后代都将包含在最终的结果集合里[^4]。 #### 结果解释 执行上面这条命令之后将会返回以编号 "1" 开头的一整棵树形结构中的全部成员列表。这不仅限于此处给出的例子,在实际应用当中可以根据业务需求调整具体的字段名以及匹配逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值