了解通用表达式:

为了让代码简洁:在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解,但是视图是系统级对象,如果数据集仅仅需要在存储过程或是自定义函数中使用一次的话,使用view有些奢侈哈

所以可以考虑用公用表达式:
可以看做是一个临时的结果集,可以在select ,insert,update,delete,merge语句中多次被引用

CTE:公用表达式
优点:group by语句可以直接作用于子查询所得的标量列
可以在一个语句中多次引用公用表达式

定义:
1公用表达式的名字在 with之后
2 一个select语句(在as之后)
3 所涉及的列名
WITH expression_name [ ( column_name [,...n] ) ]

AS

( CTE_query_definition )

按照是否递归:可以分为递归公用表达式和非递归公用表达式

1 非递归公用表达式
查询结果仅仅一次性返回一个结果集用于外部查询调用,并不在其定义的语句中调用其自身的CTE

例如:

WITH CTE_test
AS
(
SELECT *
FROM dbo.Customer AS c
) SELECT * FROM CTE_test

公用表达式的好处之一是可以在接下来的一条语句中多次引用

意思是只能在一条语句中多次引用,但是如果在不同的语句中则不能调用

但是如果需要在下面语句引用它,则需要重新定义它,如果需要定义多个,中间可以用逗号分隔

递归公用表达式:指得是在CTE内的语句调用其自身的CTE,CTE可以一次定义多次进行派生递归,

递归公有表达式:
需要实现两部分:
1 基本语句
2 递归语句
在sql中这两部分通过Union all连接结果集进行返回

递归遵循的法则:
sqlserer 提供了Option选项,可以设定最大的递归次数

WITH CTE_Customer(Id,NickName,VerifyStatus,Score)
AS
(
--基本语句
SELECT c.Id,c.Nickname,c.VerifyStatus,c.Score FROM Customer AS c WHERE c.AvatarId IS NULL
UNION ALL
--递归语句
SELECT u.Id,u.Nickname,u.VerifyStatus,u.Score FROM Customer AS u
INNER JOIN CTE_Customer cc
ON u.Id = cc.Id WHERE u.Id IN ()
) SELECT * FROM CTE_Customer
--限制递归次数
OPTION(MAXRECURSION )

sqlserver 公有表达式的更多相关文章

  1. SqlServer共用表达式(CTE)With As

    共用表表达式(CTE)可以看成是一个临时的结果集,可以再SELECT,INSERT,UPDATE,DELETE,MARGE语句中多次引用. 一好处:使用共用表表达式可以让语句更加清晰简练. 1.可以定 ...

  2. SqlServer共用表达式(CTE)With As 处理递归查询

    共用表表达式(CTE)可以看成是一个临时的结果集,可以再SELECT,INSERT,UPDATE,DELETE,MARGE语句中多次引用. 一好处:使用共用表表达式可以让语句更加清晰简练. 1.可以定 ...

  3. C# 递归构造树状数据结构(泛型),如何构造?如何查询?

    十年河东,十年河西,莫欺少年穷. 学无止境,精益求精 难得有清闲的一上午,索性写篇博客. 首先,我们需要准备一张表,如下范例: create table TreeTable ( TreeId ) no ...

  4. 【SqlServer系列】表达式(expression)

    1   概述 本篇这文章主要概述SqlServer表达式. 2   具体内容 2.1  使用范围 SQL Server(2008开始) :Azure SQL数据库:Azure  SQL数据仓库:并行数 ...

  5. (转)top关键字与top表达式(SQLServer)

    SQLServer 中,top也很有用,例如查询部分数据,还可以用表达式.其语法如下: SELECT TOP number|percent column_name(s) FROM table_name ...

  6. SqlServer:SqlServer(sql,游标,定时作业,行转列,列转行,公用表达式递归,merge合并)

    1.加载驱动: Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); DriverManager.getCo ...

  7. SQLServer学习笔记<>日期和时间数据的处理(cast转化格式、日期截取、日期的加减)和 case表达式

    日期和时间数据的处理. (1)字符串日期 ‘20080301’,这一串为字符串日期,但必须保证为四位的年份,两位的月份,两位的日期.例如,查询订单表日期大于‘20080301’.可以这样写: 1 se ...

  8. mssql sqlserver with cte表达式(递归)找出最顶值的方法分享

    摘要: 下文通过递归的方式找出最顶级部门的方法分享,如下所示: 实验环境:sql server 2008 R2 下文通过cte-with表达式实现递归,获取一个公司的顶级部门,如下所示 例:部门表 c ...

  9. SQLServer中的CTE通用表表达式

    开发人员正在研发的许多项目都涉及编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种情形是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Tr ...

随机推荐

  1. UVA 1557 - Calendar Game(博弈dp)

    UVA 1557 - Calendar Game 题目链接 题意:给定一个日期,两个人轮流走,每次能够走一月或者一天,问最后谁能走到2001.11.4这个日子 思路:记忆化搜索,对于每一个日期,假设下 ...

  2. delphi 获取驱动盘的卷标 号

    {获取C盘的卷标 格式化硬盘卷标改变} //GetHardDiskSerial('c:\') function GetHardDiskSerial(Drive: string): string; va ...

  3. C语言面试题大汇总

    static有什么用途?(请至少说明两种)1.限制变量的作用域2.设置变量的存储域7. 引用与指针有什么差别?1) 引用必须被初始化,指针不必.2) 引用初始化以后不能被改变,指针能够改变所指的对象. ...

  4. JavaScript触摸与手势事件

    JavaScript触摸与手势事件 发表于 2012-12-10 由 admin iOS版Safari为了向开发人员传达一些特殊信息,新增了一些专有事件.因为iOS设备既没有鼠标也没有键盘,所以在为移 ...

  5. Type mytableview does not confirm to portocol UITableViewDataResource

    继承UITableViewDataSource报上面这个总是,是重写协议时写错了 override func numberOfRowsInSection(section: Int) -> Int ...

  6. Python_爬虫1

    Urllib库的基本使用 那么接下来,小伙伴们就一起和我真正迈向我们的爬虫之路吧. 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的 ...

  7. Opacity多浏览器透明度兼容处理(转)

    用来设定元素透明度的 Opacity 是CSS 3里的一个属性.当然现在还只有少部分浏览器支持. 不过各个浏览器都有自己的私有属性来支持,其中包括老版本的Mozilla和Safari: IE: fil ...

  8. 一天一个mysql函数(二) FIND_IN_SET()

    in和FILD_IN_SET() 的区别: select id, list, name from table where FIND_IN_SET( 'daodao' , list) 所以如果list是 ...

  9. oracle时间格式转换问题 ORA-01810: format code appears twice--转

    今天在做报表查询的时候Oracle报错: 信息为 ORA-01810: format code appears twice 原因:由于想java一样转化时间格式,但是Oracle中是不区分大小写的,所 ...

  10. 我cnblogs的主题

    我的cnblogs主题 这里记录的是本博客的主题存档 主题代码参考自:流云诸葛的博客 博客皮肤选择 选择 LessIsMore 页面定制CSS代码 div.post div.entry { font- ...