公用表表达式(CTE)

本文介绍了在SQL中使用公共表表达式(CTE)的方法,包括为查询结果分配列别名的内联格式和外部格式,以及如何定义多个CTE进行递归查询。还提供了具体的SQL代码示例。

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

下面看在CTE中分配列别名的两种格式:内联格式和外部格式。

内联格式:

1 WITH C AS
2 (
3   SELECT YEAR(orderdate) AS orderyear, custid
4   FROM Sales.Orders
5 )
6 SELECT orderyear, COUNT(DISTINCT custid) AS numcusts
7 FROM C
8 GROUP BY orderyear;

外部格式:

1 WITH C(orderyear, custid) AS
2 (
3   SELECT YEAR(orderdate), custid
4   FROM Sales.Orders
5 )
6 SELECT orderyear, COUNT(DISTINCT custid) AS numcusts
7 FROM C
8 GROUP BY orderyear;

 定义多个CTE只需要在同一个WITH子句中用逗号把它们分隔开即可。每个CTE可以引用在它前面定义的所有CTE,而外部查询则可以引用所有CTE,例如:

 1 WITH C1 AS
 2 (
 3   SELECT YEAR(orderdate) AS orderyear, custid
 4   FROM Sales.Orders
 5 ),
 6 C2 AS
 7 (
 8   SELECT orderyear, COUNT(DISTINCT custid) AS numcusts
 9   FROM C1
10   GROUP BY orderyear
11 )
12 SELECT orderyear, numcusts
13 FROM C2
14 WHERE numcusts > 70;

CTE还可以实现对数据的递归查询。以下代码演示了如何使用递归CTE来返回有关某个雇员(Don Funk,雇员ID为2)及其所有各级(直接或间接)下属的信息:

 1 WITH EmpsCTE AS
 2 (
 3   SELECT empid, mgrid, firstname, lastname
 4   FROM HR.Employees
 5   WHERE empid = 2
 6   
 7   UNION ALL
 8   
 9   SELECT C.empid, C.mgrid, C.firstname, C.lastname
10   FROM EmpsCTE AS P
11     JOIN HR.Employees AS C
12       ON C.mgrid = P.empid
13 )
14 SELECT empid, mgrid, firstname, lastname
15 FROM EmpsCTE;

为了安全起见,SQL Server默认把递归成员最多可以调用的次数限制为100次,当递归成员的调用次数超过这个值时,代码将会因递归失败而终止运行。如要修改默认最大递归次数,可以在外部查询的最后指定OPTION(MAXRECURSION n)提示(hint),这里的n的范围是0到32767之间的整数。如果想要去掉此限制,可将MAXRECURSION设为0。

转载于:https://www.cnblogs.com/laixiancai/p/4351977.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值