转自http://msdn.microsoft.com/zh-cn/library/ms175972(SQL.100).aspx

指定临时命名的结果集,这些结果集称为公用表表达式 (CTE)。

语法:

[ WITH <common_table_expression> [ ,...n ] ]
<common_table_expression>::=
        expression_name [ ( column_name [ ,...n ] ) ]
    AS
        ( CTE_query_definition )

创建和使用公用表表达式的准则:

CTE 之后必须跟随引用部分或全部 CTE 列的单条 SELECT、INSERT、UPDATE、MERGE 或 DELETE 语句。

示例:

1. 使用递归公用表表达式显示递归的多个级别

以下示例显示经理以及向经理报告的雇员的层次列表。

代码

USE AdventureWorks;
GO
WITH DirectReports(ManagerID, EmployeeID, EmployeeLevel) AS
(
SELECT ManagerID, EmployeeID, 0 AS EmployeeLevel
FROM HumanResources.Employee
WHERE ManagerID IS NULL
UNION ALL
SELECT e.ManagerID, e.EmployeeID, EmployeeLevel + 1
FROM HumanResources.Employee e
INNER JOIN DirectReports d
ON e.ManagerID = d.EmployeeID
)
SELECT ManagerID, EmployeeID, EmployeeLevel
FROM DirectReports ;
GO

2. 使用递归公用表表达式显示递归的两个级别

以下示例显示经理以及向经理报告的雇员。将返回的级别数目被限制为两个。

代码

USE AdventureWorks;
GO
WITH DirectReports(ManagerID, EmployeeID, EmployeeLevel) AS
(
SELECT ManagerID, EmployeeID, 0 AS EmployeeLevel
FROM HumanResources.Employee
WHERE ManagerID IS NULL
UNION ALL
SELECT e.ManagerID, e.EmployeeID, EmployeeLevel + 1
FROM HumanResources.Employee e
INNER JOIN DirectReports d
ON e.ManagerID = d.EmployeeID
)
SELECT ManagerID, EmployeeID, EmployeeLevel
FROM DirectReports
WHERE EmployeeLevel <= 2 ;
GO

3. 使用递归公用表表达式显示层次列表

通过缩进各个级别,突出显示经理和雇员的层次结构。

代码

USE AdventureWorks;
GO
WITH DirectReports(Name, Title, EmployeeID, EmployeeLevel, Sort)
AS (SELECT CONVERT(varchar(255), c.FirstName + ' ' + c.LastName),
e.Title,
e.EmployeeID,
1,
CONVERT(varchar(255), c.FirstName + ' ' + c.LastName)
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID IS NULL
UNION ALL
SELECT CONVERT(varchar(255), REPLICATE ('| ' , EmployeeLevel) +
c.FirstName + ' ' + c.LastName),
e.Title,
e.EmployeeID,
EmployeeLevel + 1,
CONVERT (varchar(255), RTRIM(Sort) + '| ' + FirstName + ' ' +
LastName)
FROM HumanResources.Employee as e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID
)
SELECT EmployeeID, Name, Title, EmployeeLevel
FROM DirectReports
ORDER BY Sort;
GO

4. 在 UPDATE 语句中使用递归 CTE

以下示例将直接或间接向 ManagerID 12 报告的所有雇员的 VacationHours 值增加 25%。公用表表达式将返回直接向 ManagerID 12
报告的雇员以及直接向这些雇员报告的雇员等的层次列表。只修改公用表表达式所返回的行。

代码

USE AdventureWorks;
GO
WITH DirectReports(EmployeeID, NewVacationHours, EmployeeLevel)
AS
(SELECT e.EmployeeID, e.VacationHours, 1
FROM HumanResources.Employee AS e
WHERE e.ManagerID = 12
UNION ALL
SELECT e.EmployeeID, e.VacationHours, EmployeeLevel + 1
FROM HumanResources.Employee as e
JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID
)
UPDATE HumanResources.Employee
SET VacationHours = VacationHours * 1.25
FROM HumanResources.Employee AS e
JOIN DirectReports AS d ON e.EmployeeID = d.EmployeeID;
GO

转载于:https://www.cnblogs.com/NewSunshineLife/archive/2010/07/22/1783062.html

公用表表达式(CTE)WITH:树型查询、更新相关推荐

  1. 在Sql Server 2005使用公用表表达式CTE简化复杂的查询语句

    公用表表达式CTE是Sql Server 2005引入的一种新的表表达式.CTE在许多方面都类似于派生表.逻辑上CTE是一个临时结果集,它仅仅存在于它发生的语句中.您可以在SELECT.INSERT. ...

  2. T-SQL查询进阶--详解公用表表达式(CTE)

    简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的.但是,视图是作为系统对象存在数据库中,那对于结果集 ...

  3. mysql cte 语法,mysql8 公用表表达式CTE的使用方法实例分析

    本文实例讲述了mysql8 公用表表达式cte的使用方法.分享给大家供大家参考,具体如下: 公用表表达式cte就是命名的临时结果集,作用范围是当前语句. 说白点你可以理解成一个可以复用的子查询,当然跟 ...

  4. 详解公用表表达式(CTE)

    简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的.但是,视图是作为系统对象存在数据库中,那对于结果集 ...

  5. SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用

    原文: SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用 本文出处:http://www.cnblogs.com/wy123/p/5960825.html 我们在做开 ...

  6. cte mysql_mysql8 公用表表达式CTE的使用

    公用表表达式CTE就是命名的临时结果集,作用范围是当前语句. 说白点你可以理解成一个可以复用的子查询,当然跟子查询还是有点区别的,CTE可以引用其他CTE,但子查询不能引用其他子查询. 一.cte的语 ...

  7. mysql cte_mysql8 公用表表达式CTE的使用方法实例分析

    本文实例讲述了mysql8 公用表表达式CTE的使用方法.分享给大家供大家参考,具体如下: 公用表表达式CTE就是命名的临时结果集,作用范围是当前语句. 说白点你可以理解成一个可以复用的子查询,当然跟 ...

  8. T-SQL之公用表表达式(CTE)

    题外话: 以前也写过几篇,后来总算觉得写得不够好,写了点又删了点,最后一直没有东西留下来,随着时间的流逝,几乎没有积累.最近在看T-SQL相关的书,结合工作中遇到的问题,我打算写点东西来记录我的学习经 ...

  9. as my sql 后面加表达式_SQL.WITH AS.公用表表达式(CTE)(转)

    一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候,是为了让 ...

最新文章

  1. linux shell if [[ ]]和[ ]区别 ||
  2. 派生类的拷贝构造【C++继承】
  3. 使用TCP可靠吗?为什么可靠?
  4. 指针和引用的区别_浅析指针与引用
  5. [转载]十四步实现拥有强大AI的五子棋游戏
  6. Uploading File using Ajax and receiving binary data in Asp.net (C#)[转]
  7. Android-Universal-Image-Loader学习笔记(二)--LruDiscCache
  8. EXCLE调用REFPROP操作以及问题
  9. 【多元统计分析及R语言建模】第一章第 多元统计分析的概述
  10. 2022年中国工业机器人市场现状研究分析与发展前景预测报告
  11. java实现一个录像大师
  12. SNP基因数据质控调研
  13. 查看linux系统显卡型号
  14. html第三章练习1:音乐排行榜
  15. 新型博客网站的运营要素分析
  16. Finished with error:Navicat 运行SQL文件 报错
  17. frl啥意思_手表日历显示frl是什么意思
  18. 服务器系统server2008 qq,WindowsServer2008R2服务器系统安装教程
  19. Linux 下C/C++实现发送ICMP和ICMPv6(报文分析)
  20. Android 自定义视频播放器,可用于以视频做背景的需求

热门文章

  1. SQL:waitfor的使用
  2. wordpress博客留言自动填写
  3. Automatic IE Testing With Python
  4. 如何使用PHP编写daemon process
  5. 关于linux内核无法编译成模块的解决方法
  6. gj4 深入类和对象
  7. S1.2 Python开发规范指南
  8. python车辆轨迹分析_Ngsim数据集分析与python处理,NGSIM,解析,及
  9. 电脑销售渠道_为园区企业搭建服务麦格米特,长城电脑等企业产业链销售渠道...
  10. orcle 删除表报正在使用_oracle 删除表空间错误 提示:ora-02429:无法删除用于强制唯一/...