学习递归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;

查询结果图:


 

posted @   ok_008  阅读(1091)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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编号厂商主频电压等全部信息)
给我写信
点击右上角即可分享
微信分享提示