CTE 获取父母的所有孩子(后代)

sqlserver

1个回答

写回答

cmru

2025-06-28 23:05

+ 关注

CTE(通用表达式)及其在获取父母的所有孩子中的应用

在数据库中,我们经常需要查询某个表中的数据,并且还需要获取与之相关联的其他数据。在这种情况下,通用表达式(CTE)可以帮助我们轻松地完成这样的查询。本文将介绍CTE的基本概念,并以获取父母的所有孩子为例,演示CTE在实际应用中的用法。

什么是CTE?

CTE是一种临时命名的结果集,它可以在一个查询中被多次引用。CTE可以视为一个临时表,但不需要创建表的结构。它可以在查询中定义,并且只在查询执行期间存在。

获取父母的所有孩子

假设我们有一个名为"family"的表,其中包含了每个人的ID、姓名以及父母的ID。我们的目标是根据父母的ID获取所有孩子的姓名。下面是一个示例的"family"表:

ID | Name | ParentID

----|--------|---------

1 | John | NULL

2 | Mary | NULL

3 | Adam | 1

4 | Emily | 1

5 | James | 2

6 | Lily | 2

7 | Ethan | 3

8 | Olivia | 3

9 | Sophia | 3

现在,我们希望根据父母的ID获取所有孩子的姓名。我们可以使用CTE来实现这个目标。下面是一个使用CTE的查询示例:

WITH RecursiveChildren AS (

SELECT ID, Name, ParentID

FROM family

WHERE ParentID IS NULL -- 获取顶级父母

UNION ALL

SELECT f.ID, f.Name, f.ParentID

FROM family f

INNER JOIN RecursiveChildren rc ON f.ParentID = rc.ID

)

SELECT ID, Name

FROM RecursiveChildren

ORDER BY ID;

通过上述查询,我们首先选择了顶级父母(ParentID为NULL的记录),并将其作为递归查询的起点。然后,我们使用UNION ALL将递归查询与family表进行连接,直到找到所有孩子的记录。最后,我们按照ID对结果进行排序,得到了所有父母的孩子的姓名。

代码示例

下面是一个使用SQL Server的案例代码,演示了如何通过CTE获取父母的所有孩子:

sql

-- 创建family表

CREATE TABLE family (

ID INT,

Name VARCHAR(50),

ParentID INT

);

-- 向family表插入数据

INSERT INTO family (ID, Name, ParentID) VALUES

(1, 'John', NULL),

(2, 'Mary', NULL),

(3, 'Adam', 1),

(4, 'Emily', 1),

(5, 'James', 2),

(6, 'Lily', 2),

(7, 'Ethan', 3),

(8, 'Olivia', 3),

(9, 'Sophia', 3);

-- 使用CTE获取父母的所有孩子

WITH RecursiveChildren AS (

SELECT ID, Name, ParentID

FROM family

WHERE ParentID IS NULL -- 获取顶级父母

UNION ALL

SELECT f.ID, f.Name, f.ParentID

FROM family f

INNER JOIN RecursiveChildren rc ON f.ParentID = rc.ID

)

SELECT ID, Name

FROM RecursiveChildren

ORDER BY ID;

通过上述代码,我们首先创建了"family"表,并向其插入了示例数据。然后,我们使用CTE查询获取了所有父母的孩子的姓名,并按照ID进行排序。通过执行以上代码,我们可以得到以下结果:

ID | Name

----|--------

3 | Adam

4 | Emily

7 | Ethan

8 | Olivia

9 | Sophia

5 | James

6 | Lily

CTE是一种强大的查询工具,可以帮助我们轻松地获取与某个表中数据相关联的其他数据。在本文中,我们以获取父母的所有孩子为例,演示了CTE在实际应用中的用法。通过使用CTE,我们可以方便地获取父母的所有孩子的姓名,并且代码简洁易懂。如果您在日常的数据库查询中遇到了类似的情况,不妨尝试使用CTE来解决问题。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号