学习递归CTE
什么叫CTE:
指定临时命名的结果集,这些结果集称为公用表表达式 (CTE)。
语法:
[ WITH <common_table_expression> [ ,...n ] ]
<common_table_expression>::=
expression_name [ ( column_name [ ,...n ] ) ]
AS
( CTE_query_definition )
expression_name :
公用表表达式的有效标识符。
column_name :
在公用表表达式中指定列名
CTE_query_definition :
指定一个其结果集填充公用表表达式的 SELECT 语句
这里主要是学习递归CTE。
这里使用帮助文档的SQL例子。
以下示例使用多个定位点和递归成员来返回指定的人的所有祖先。
家谱结构如图:
-- 创建家谱表并插入数据:
IF OBJECT_ID('Person','U') IS NOT NULL DROP TABLE Person;
GO
CREATE TABLE Person(ID int, Name varchar(30), Mother int, Father int);
GO
INSERT Person VALUES(1, 'Sue', NULL, NULL);
INSERT Person VALUES(2, 'Ed', NULL, NULL);
INSERT Person VALUES(3, 'Emma', 1, 2);
INSERT Person VALUES(4, 'Jack', 1, 2);
INSERT Person VALUES(5, 'Jane', NULL, NULL);
INSERT Person VALUES(6, 'Bonnie', 5, 4);
INSERT Person VALUES(7, 'Bill', 5, 4);
GO
--建立递归CTE,找出邦妮(Bonnie)的所以祖先:
WITH Generation (ID) AS
(
-- 第一个定位点:找出Bonnie的母亲
SELECT Mother
FROM Person
WHERE Name = 'Bonnie'
UNION
-- 第二个定位点:找出Bonnie的父亲
SELECT Father
FROM Person
WHERE Name = 'Bonnie'
UNION ALL
-- 第一个递归找出父辈的祖先(男)
SELECT Person.Father
FROM Generation, Person
WHERE Generation.ID=Person.ID
UNION ALL
-- 第二个递归找出父辈的祖先(女)
SELECT Person.Mother
FROM Generation, Person
WHERE Generation.ID=Person.ID
)
SELECT Person.ID, Person.Name, Person.Mother, Person.Father
FROM Generation, Person
WHERE Generation.ID = Person.ID;
GO
在Word中画图说明,如图:
结果如图Genealogy2:
找出与Sue有血缘关系的子孙:
Sue--->Emma、Jack--->Bill、Bonnie
如图:
--找出与Sue有血缘关系的子孙
WITH Generation1(id) as
(
SELECT ID FROM Person WHERE Name='Sue'
UNION ALL
SELECT A.ID FROM Person A
INNER JOIN Generation1 B ON A.Mother=B.id
UNION ALL
SELECT A.ID FROM Person A
INNER JOIN Generation1 B ON A.Father=B.id
)
SELECT Person.ID, Person.Name, Person.Mother, Person.Father
FROM Generation1, Person
WHERE Generation1.ID = Person.ID;
查询结果图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2007-03-23 C#精髓(WMI完美秀出CPU编号厂商主频电压等全部信息)