在很多编程语言中都有 for循环这样的东西。在数据库里面 替代他是 游标

但是游标使用起来是相当耗费资源的,今天看见一个CTE尝试了下他的用法

create table employewhere
(
 id int identity(1,1),
 [name] varchar(10),
 [value] varchar(10),
 [ttime] int
)

insert employewhere
select '张三',2,1
union all
select '张三',2,2
union all
select '张三',2,3
union all
select '张三',2,4
union all
select '李四',2,1
union all
select '李四',2,2
union all
select '李四',2,3
union all
select '李四',2,4
union all
select '李四',2,1

insert employewhere
select '王五',2,1
union all
select '王五',2,3
union all
select '王五',2,4

我想得到ttime为连续数字的name

张三

李四

select * from  employewhere

1 张三 2 1
2 张三 2 2
3 张三 2 3
4 张三 2 4
5 李四 2 1
6 李四 2 2
7 李四 2 3
8 李四 2 4
9 王五 2 1
10 王五 2 3
11 王五 2 4
12 王五 2 1
13 王五 2 3
14 王五 2 4
15 王五 2 1
16 王五 2 3
17 王五 2 4

-----------------------------

with myCTE as
(
 select id,[name],value,ttime ,1 as number   from employewhere where value=2
 union all
 select tt.id,tt.name,tt.value,tt.ttime ,number+1 from employewhere as tt
 inner join myCTE on myCTE.[name]=tt.[name] and tt.ttime=myCTE.ttime+1--连接起来的条件
 where tt.value=2
)
select * from myCTE where number>3

8 李四 2 4 4
4 张三 2 4 4

但是为什么要这么写呢

我们可以这么执行查询里面的数据

with myCTE as
(
 select id,[name],value,ttime ,1 as number   from employewhere where value=2
 union all
 select tt.id,tt.name,tt.value,tt.ttime ,number+1 from employewhere as tt
 inner join myCTE on myCTE.[name]=tt.[name] and tt.ttime=myCTE.ttime+1--连接起来的条件
 where tt.value=2
)
select * from myCTE

可以得到数据

1 张三 2 1 1
2 张三 2 2 1
3 张三 2 3 1
4 张三 2 4 1
5 李四 2 1 1
6 李四 2 2 1
7 李四 2 3 1
8 李四 2 4 1
9 王五 2 1 1
10 王五 2 3 1
11 王五 2 4 1
12 王五 2 1 1
13 王五 2 3 1
14 王五 2 4 1
15 王五 2 1 1
16 王五 2 3 1
17 王五 2 4 1
11 王五 2 4 2
14 王五 2 4 2
17 王五 2 4 2
11 王五 2 4 2
14 王五 2 4 2
17 王五 2 4 2
11 王五 2 4 2
14 王五 2 4 2
17 王五 2 4 2
8 李四 2 4 2
7 李四 2 3 2
8 李四 2 4 3
6 李四 2 2 2
7 李四 2 3 3
8 李四 2 4 4
4 张三 2 4 2
3 张三 2 3 2
4 张三 2 4 3
2 张三 2 2 2
3 张三 2 3 3
4 张三 2 4 4

是不是发现很多重复数据 同时可以更直观的让我们认识 其实 CTE本身就是一个临时表这样的一个东西 只是不要你进行创建

最后面一排 使我们写的 number

然后我们在进行筛选

where number>3

就是排序中连续有三个的

于是就把 我们

张三和李四查询出来了

SQL数据库CTE的用法相关推荐

  1. mysql raiserror_RAISERROR在SQL Server数据库中的用法

    raiserror  是由单词 raise error 组成 raise  增加; 提高; 提升 raiserror 的作用: raiserror 是用于抛出一个错误.[ 以下资料来源于sql ser ...

  2. 查询前几条记录SQL在不同数据库中的用法

    13,(1)查询前几条记录SQL在不同数据库中的用法; 1. ORACLE SELECT * FROM TABLE1 WHERE ROWNUM<=N 2. INFORMIX SELECT FIR ...

  3. oracle判断是否为空为空赋值,sql数据库中ISNULL函数用法 sql语句判断值是否为空...

    在使用sql数据库的过程,由于服务器设置不当导致sql server的某个字段为空,导致部分内容显示失败,就需要将为空的字符替换为制定的字符. 例子,sql语句: use 数据库 update new ...

  4. SQL数据库语句中escape的用法及含义

    SQL数据库语句中escape的用法及含义 escape是用来转译的 例如: 数据库中有个表 A字段abc 中存du了字符'%',那么我查询的时候如果只想查询第二位是 '%'的记录就需要进行模糊查询, ...

  5. mysql sql between,数据库between的用法

    数据库between的用法的用法你知道吗?下面小编就跟你们详细介绍下数据库between的用法的用法,希望对你们有用. 数据库between的用法的用法如下: MySQL BETWEEN 语法 BET ...

  6. SQL数据库操作完全手册

    SQL数据库完全手册 日期:2001-3-24 0:47:00 出处:电脑报 作者:未知 SQL是Structured Quevy Language(结构化查询语言)的缩写.SQL是专为数据库而建立的 ...

  7. ASP中怎么实现SQL数据库备份、恢复!

    选择自 hanghwp 的 Blog 1.ASP中怎么实现SQL数据库备份.恢复! 答:asp在线备份sql server数据库: 1.备份 <% SQL="backup databa ...

  8. SQL中Truncate的用法

    转自:https://www.cnblogs.com/zhoufangcheng04050227/p/7991759.html 本文导读:删除表中的数据的方法有delete,truncate, 其中T ...

  9. mysql数据库replace写入_MySQL数据库replace into 用法(insert into 的增强版)

    MySQL数据库replace into 用法我以前介绍过相关的教程,但有加强版各位朋友可能不知道吧,今天我们来看一篇关于MySQL数据库replace into增强版的介绍与用法例子. Error ...

最新文章

  1. ExecuteNonQuery返回值问题
  2. 商城分类表-二级,内容较全
  3. 在大数据时代,我们需要数据售货员
  4. ARM 嵌入式入门经验
  5. pandas中inplace_pandas回顾小结(二)
  6. 重大技术突破首次发布!十问解密云栖大会!
  7. 初级java程序员怎样快速提升自己
  8. 【华为云技术分享】华为专家亲述:如何转型搞 AI?
  9. 罗彻斯特大学计算机科学系专业排名,罗切斯特大学计算机专业怎么样?
  10. 快速划分分栏控制器上的item(自定义)
  11. Android、iOS、和Web如何做灰度发布?
  12. php 时间类型int类型,mysql 查询 int类型日期转换成datetime类型
  13. 大数据实效_普洱市以“大数据”思维全面提升新时代干部管理监督实效
  14. 简化企业CMMI5认证过程?
  15. xcap 发包工具 使用帮助
  16. Visual Studio 2015安装配置图文教程
  17. VS2017好用的插件推荐
  18. 浅谈大型互联网的企业入/侵及防护策略
  19. 5.3 10篇美食类小红书爆文拆解【玩赚小红书】
  20. Spring Boot配置文件---约定大于配置

热门文章

  1. 遗传算法中的锦标赛选择
  2. 通过IDEA打jar包
  3. 手机查看亚马逊官方kiddle书籍文件.awz3
  4. 冰层厚度监测仪-应用雷达技术监测冰层厚度
  5. An unexpected error has occurred. Conda has prepared the above report
  6. ASO大讲堂(三)丨 到底是谁在影响ASO?
  7. 华为畅享20pro和华为nova7哪个好
  8. 打印CAD图纸时如何设置按线宽打印?
  9. 【软件工程系列】面向对象方法学
  10. IDEA设置忽略git提交的文件