通用表表达式(Common Table Expression)

问题:编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句。

方案1:编写在From子句内使用派生表(内联视图)的T-SQL查询语句。

方案2:使用视图

方案3:使用通用表达式(CTE)

比较:

视图:通常用于分解大型查询,无需在临时表中复制或存储数据,数据库中可以重复使用。

 1 CREATE VIEW vwMyView AS
 2 SELECT
 3     EmployeeID, COUNT(*) AS NumOrders,  MAX(OrderDate) AS MaxDate
 4 FROM Orders
 5 GROUP BY EmployeeID
 6 GO
 7
 8 SELECT
 9     e.EmployeeID, oe.NumOrders, oe.MaxDate, e.ReportsTo AS ManagerID,
10     om.NumOrders, om.MaxDate
11 FROM
12     Employees AS e
13     INNER JOIN vwMyView AS oe ON e.EmployeeID = oe.EmployeeID
14     INNER JOIN vwMyView AS om ON e.ReportsTo = om.EmployeeID

派生表:只能在派生表所在的语句中访问它们,使查询变得更难以阅读和维护(若同一个批处理中要多次使用派生表,必须复制粘贴派生表)

 1 SELECT
 2     e.EmployeeID, oe.NumOrders, oe.MaxDate,  e.ReportsTo AS ManagerID,
 3     om.NumOrders, om.MaxDate
 4 FROM
 5     Employees AS e
 6     INNER JOIN
 7         (SELECT EmployeeID, COUNT(*), MAX(OrderDate)
 8          FROM Orders
 9          GROUP BY EmployeeID) AS oe(EmployeeID, NumOrders, MaxDate)
10         ON e.EmployeeID = oe.EmployeeID
11     LEFT JOIN
12         (SELECT EmployeeID, COUNT(*), MAX(OrderDate)
13          FROM Orders
14          GROUP BY EmployeeID) AS om(EmployeeID, NumOrders, MaxDate)
15         ON e.ReportsTo = om.EmployeeID

CET:提升了 T-SQL 的可读性(就像视图一样),在同一个批处理后紧跟的查询中多次使用,不会在内部创建临时表或虚拟表

 1 ;WITH EmpOrdersCTE (EmployeeID, NumOrders, MaxDate) AS
 2 (
 3   SELECT EmployeeID, COUNT(*), MAX(OrderDate)
 4   FROM Orders
 5   GROUP BY EmployeeID
 6 )
 7
 8 SELECT
 9     e.EmployeeID,  oe.NumOrders, oe.MaxDate,
10     e.ReportsTo AS ManagerID,  om.NumOrders, om.MaxDate
11 FROM
12     Employees AS e
13     INNER JOIN EmpOrdersCTE oe ON e.EmployeeID = oe.EmployeeID
14     LEFT JOIN EmpOrdersCTE om ON e.ReportsTo = om.EmployeeID
时间: 2024-10-12 10:41:55

通用表表达式(Common Table Expression)的相关文章

关于SQL中CTE(公用表表达式)(Common Table Expression)的总结

WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到 一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候,是为了让SQL语句的可读性更高些, 也有可能是在UNION ALL的不同部分,作为提供数据的部分. 特别对于UNION ALL比较有用.因为UNION

Sql Server系列:通用表表达式CTE

1 CTE语法WITH关键字 通用表表达式(Common Table Express, CTE),将派生表定义在查询的最前面.要使用CTE开始创建一个查询,可以使用WITH关键字. CTE语法: WITH <expression_name> [(column_name [,...n])] AS ( CTE_query_definition) [, <another_expression>] <query> 首先为CTE提供一个名称,该名称类似于用于派生表的别名.然后可以

SQL中的CTE通用表表达式

开发人员正在研发的许多项目都涉及编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种情形是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Transact-SQL (T-SQL) 查询.这一常规使开发人员能获取一个行集,并立即将该行集加入到 SELECT 语句中的其他表.视图和用户定义函数中.另一种方案是使用视图而不是派生表.这两种方案都有其各自的优势和劣势. 当使用 SQL Server™ 2005 时,我更倾向于第三种方案,就是使用通

T-SQL 公用表表达式(CTE)

公用表表达式(CTE) 在编写T-SQL代码时,往往需要临时存储某些结果集.前面我们已经广泛使用和介绍了两种临时存储结果集的方法:临时表和表变量.除此之外,还可以使用公用表表达式的方法.公用表表达式(Common Table Expression)是SQL Server2005版本的引入的一个特性.CTE可以看组是一个临时的结果集,可以再接下来来的一个SELECT,INSERT,UPDATE,DELETE,MERGE语句中多次引用.使用公用表达式CTE可以让语句更加清晰简练.与公用表达式作用类似

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

在编写T-SQL代码时,往往需要临时存储某些结果集.在CTE之前常用的两种临时存储结果集为:临时表和表变量.除此之外,还可以使用公用表表达式的方法. 公用表表达式(Common Table Expression)是SQL Server2005版本的引入的一个特性.CTE可以看作是一个临时的结果集,可以再接下来来的一个SELECT,INSERT,UPDATE,DELETE,MERGE 语句中多次引用.使用公用表达式CTE可以让语句更加清晰简练. 一.三种方式的对比 (一).临时表:需要在临时数据库

CTE(公用表表达式)

CTE(公用表表达式) 含义 在编写T-SQL代码时,往往需要临时存储某些结果集.广泛使用两种临时存储结果集的方法:临时表和表变量.除此之外,还可以使用公用表表达式的方法.公用表表达式(Common Table Expression)是SQL Server2005版本的引入的一个特性.CTE可以看组是一个临时的结果集,可以再接下来来的一个 SELECT,INSERT,UPDATE,DELETE,MERGE语句中多次引用.使用公用表达式CTE可以让语句更加清晰简练. 如果WITH AS短语所定义的

公用表表达式

大家好,今天我们来学习一下公用表表达式.在项目中需要编写SQL语句,因为自己本身对SQL Server知之甚少,一些较复杂的SQL语句,我是写不出来的.于是,请教我的一位好朋友,数据库MVP.他给我发来了一段SQL语句,相当好用.在佩服他的SQL语句时,我发现了公用表表达式这个概念,于是就Bing了一篇文章,用心研究了一番.在这里与大家分享一下我的学习心得. 公用表表达式(Common Table Expressions) CTE(公用表表达式)的作用类似于我们的临时表,就是可以作为SELECT

Sql server 表表达式

1.表表达式概述 (1)表表达式(table expression) 是一个命名的查询表达式.代表一个有效的关系表 (2)在DML 中,使用表表达式和使用其他表非常类似 (3)sqlserver 支持4种表表达式: 派生表.公用表达式(CTE).视图 .内嵌值函数(内嵌TVF) (4)表表达式没有任何的物理实例化.是虚拟的.内部查询是嵌套 的 (5)使用表表达式的好处是代码逻辑方便有关.与性能无关.表表达式本身不会对性能带来正负影响 2.有效定义表表达式查询需要满足的3个要求 2.1 无法保证顺

Sql — CTE公用表表达式和With用法总结

CTE(Common Table Expression) 公用表表达式,它是在单个语句的执行范围内定义的临时结果集,只在查询期间有效.它可以自引用,也可在同一查询中多次引用,实现了代码段的重复利用. CTE最大的好处是提升T-Sql代码的可读性,可以更加优雅简洁的方式实现递归等复杂的查询. CTE可用于: ⒈ 创建递归查询,这个应该是CTE最好用的地方 ⒉ 在同一语句中多次引用生成的表 3. 减少子查询和表变量,提高执行效率 CTE优点: 1. 使用 CTE 可以获得提高可读性和轻松维护复杂查询