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提供一个名称,该名称类似于用于派生表的别名。然后可以提供CTE将返回的列名列表;如果CTE指定了它的所有返回列,则这是可选操作。最后,在圆括号中添加CTE查询的定义,最后添加使用CTE的主查询。
WITH关键字之前的语句必须使用分号(;)结束。
示例
WITH cte
AS
(
SELECT * FROM [dbo].[Product]
) SELECT [ProductID],[ProductCode],[ProductName],[UnitPrice] FROM cte
连接查询示例
WITH ProductCTE([CategoryID], [ProductsCount])
AS
(
SELECT [CategoryID],COUNT(1)
FROM [dbo].[Product]
GROUP BY [CategoryID]
) SELECT c.[CategoryID],c.[CategoryName], cte.[ProductsCount]
FROM [dbo].[Category] c
INNER JOIN ProductCTE cte
ON c.[CategoryID] = cte.[CategoryID]
ORDER BY cte.[ProductsCount]
2 使用多个CTE
使用WITH开始语句可以定义多个CTE,不需要重复使用WITH关键字,每一个CTE可以使用在该语句中已经定义的任意CTE(作为其定义的一部分)。
WITH CategoryCTE
AS
(
SELECT * FROM [dbo].[Category]
),ProductCTE
AS
(
SELECT p.*,cte.[CategoryName] FROM [dbo].[Product] p
INNER JOIN CategoryCTE cte
ON p.[CategoryID] = cte.[CategoryID]
) SELECT * FROM ProductCTE
3 递归CTE
递归公用表表达式是在CTE内的语句中调用其自身的CTE。
示例
WITH cte([CategoryID],[CategoryName],[ParentID],[Level])
AS
(
-- 查询语句
SELECT [CategoryID],[CategoryName],[ParentID],1 AS [Level] FROM [dbo].[Category]
WHERE [ParentID] IS NULL
UNION ALL
-- 递归语句
SELECT c.[CategoryID],c.[CategoryName],c.[ParentID], cte.[Level] + 1
FROM [dbo].[Category] c
INNER JOIN cte
ON c.[CategoryID] = cte.[ParentID]
) SELECT [CategoryID],[CategoryName],[ParentID],[Level] FROM cte
限制递归层次
WITH cte([CategoryID],[CategoryName],[ParentID],[Level])
AS
(
-- 查询语句
SELECT [CategoryID],[CategoryName],[ParentID],1 AS [Level] FROM [dbo].[Category]
WHERE [ParentID] IS NULL
UNION ALL
-- 递归语句
SELECT c.[CategoryID],c.[CategoryName],c.[ParentID], cte.[Level] + 1
FROM [dbo].[Category] c
INNER JOIN cte
ON c.[CategoryID] = cte.[ParentID]
) SELECT [CategoryID],[CategoryName],[ParentID],[Level] FROM cte
OPTION(MAXRECURSION 2)
Where过滤递归结果数据层次
WITH cte([CategoryID],[CategoryName],[ParentID],[Level])
AS
(
-- 查询语句
SELECT [CategoryID],[CategoryName],[ParentID],1 FROM [dbo].[Category]
WHERE [ParentID] IS NULL
UNION ALL
-- 递归语句
SELECT c.[CategoryID],c.[CategoryName],c.[ParentID], [Level] + 1
FROM [dbo].[Category] c
INNER JOIN cte
ON c.[CategoryID] = cte.[ParentID]
) SELECT [CategoryID],[CategoryName],[ParentID],[Level] FROM cte
WHERE cte.[Level] <= 3
Sql Server系列:通用表表达式CTE的更多相关文章
- sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期
问题:在数据库脚本开发中,有时需要生成一堆连续数字或者日期,例如yearly report就需要连续数字做年份,例如daily report就需要生成一定时间范围内的每一天日期.而自带的系统表mast ...
- SQL Server CET 通用表表达式 之 精典递归
SQL2005 Common Table Expressions(CET)即通用表表达式. SQLSERVER CET递归使用案例: 1.普通案例 表结构如下: ;WITH cet_depart ...
- SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用
本文出处:http://www.cnblogs.com/wy123/p/5960825.html 我们在做开发的时候,有时候会需要一些帮助数据,必须需要连续的数字,连续间隔的时间点,连续的季度日期等等 ...
- SQL Server温故系列(3):SQL 子查询 & 公用表表达式 CTE
1.子查询 Subqueries 1.1.单行子查询 1.2.多行子查询 1.3.相关子查询 1.4.嵌套子查询 1.5.子查询小结及性能问题 2.公用表表达式 CTE 2.1.普通公用表表达式 2. ...
- sql server编写简洁四则运算表达式脚本实现计算批次功能(C#等其它编程语言也能直接用此通用表达式)
问题: 在数据库编程开发中,有时会遇到数据量比较大的情况,如果直接大批量进行添加数据.修改数据.删除数据,就会是比较大的事务,事务日志也比较大,耗时久的话会对正常操作造成一定的阻塞.虽不至于达到删库跑 ...
- SQLServer中的CTE(Common Table Expression)通用表表达式使用详解
概述 我们经常会编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种方案是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Transact-S ...
- SQLServer中的CTE通用表表达式
开发人员正在研发的许多项目都涉及编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种情形是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Tr ...
- SQL Server系列目录
一.SQL Server基础部分 1 数据库概念及规范化设计 1.1 数据库物理模式设计 1.2 Microsoft SQL Server Management Studio模板资源管理器 2 数据 ...
- 公用表表达式 (CTE)、递归、所有子节点、sqlserver
指定临时命名的结果集,这些结果集称为公用表表达式 (CTE).公用表表达式可以包括对自身的引用.这种表达式称为递归公用表表达式. 对于递归公用表达式来说,实现原理也是相同的,同样需要在语句中定义两部分 ...
随机推荐
- 利用 HashSet 去过滤元素是否重复
HashSet<Integer> hashSet = new HashSet<Integer>(); for (int i = resultDoctorDetails.size ...
- Apache Permission denied (httpd.conf配置和目录权限无问题)解决办法
今天在CentOS5.9中配置zabbix时出现错误:Apache 403 error, (13)Permission denied: access to / denied 检查了一圈httpd.co ...
- Time-travel Models
1. Standard Iterative Branching model Source Code Butterfly Effect Next Edge of Tomorrow D ...
- Redis 主从配置
环境 Master/Slave 系统 IP Redis版本 Master CentOS6.7 10.10.3.211 redis-3.2.6 ...
- Win10系统怎样让打开图片方式为照片查看器
转载自:百度经验 http://jingyan.baidu.com/article/5d368d1ef0cad13f60c057e3.html 1.首先,我们需要使用注册表编辑器来开启Win10系统照 ...
- linux 用户管理
linux 用户管理 创建一个用户 foo 这个用户只能在/home/foo 上面增加删除文件, foo 不能在其他目录加减文件 useradd -d /home/foo -m foo [root@] ...
- 20161022 NOIP模拟赛 解题报告
好元素 [问题描述] 小A一直认为,如果在一个由N个整数组成的数列{An}中,存在以下情况: Am+An+Ap = Ai (1 <= m, n, p < i <= N , m,n ...
- php 搜索(查询)功能
今天遇到一个问题:在做“搜索”功能时,输入查询条件后查询不了. 我做的是首页显示数据表package中的内容,但是有个条件,显示在首页的内容还必须是 :字段status=0,且printing=0的数 ...
- 【WPF】WPF中的List<T>和ObservableCollection<T>
在WPF中 控件绑定数据源时,数据源建议采用 ObservableCollection<T>集合 ObservableCollection<T> 类:表示一个动态数据集合,在添 ...
- ntko office在线编辑控件问题记录
ntko office在线预览插件 http://www.ntko.com/ 问题:火狐或谷歌下保存报[没有打开的文档]错误,ie正常 原因:火狐.谷歌.ie的各方法执行文字不同,ie嵌在页面,而火狐 ...