最近,同事需要从数个表中查询用户的业务和报告数据,写了一个SQL语句,查询比较慢:

Select

S.Name,

S.AccountantCode,

(

Select COUNT(*) from (

Select Distinct BusinessBackupId from Biz_BusinessBackupCustomer where Id in (

Select BusinessBackupCustomerId from Rpt_RegistForm where ( SignatureCPA1Id=S.Id or SignatureCPA2Id=S.Id ) and DocStatus=30

) ) T

) as 'BNum',

(case when R.Id is null then 0 else 1 end ) as 'Num',

R.ReportBackupDate

from

Base_Staff S

left join Rpt_RegistForm R on ( R.SignatureCPA1Id=S.Id or R.SignatureCPA2Id=S.Id ) and R.DocStatus=30

where S.UserType=3

该查询需要执行10秒左右,仔细分析,它有2次查询类似的结果集(Base_Staff,Rpt_RegistForm 关联部分),这正是CTE应用的场合。

从SQLSERVER 联机丛书,我们来了解下CET的概念:

ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS/s10de_6tsql/html/27cfb819-3e8d-4274-8bbe-cbbe4d9c2e23.htm

指定临时命名的结果集,这些结果集称为公用表表达式 (CTE)。该表达式源自简单查询,并且在单条 SELECT、INSERT、UPDATE、MERGE 或 DELETE 语句的执行范围内定义。该子句也可用在 CREATE VIEW 语句中,作为该语句的 SELECT 定义语句的一部分。公用表表达式可以包括对自身的引用。这种表达式称为递归公用表表达式。

下面看看经过CET改写过的查询:

With CTE as

(

select

--s.Id as S_ID,

s.Name ,s.AccountantCode,

r.BusinessBackupCustomerId --, r.Id as R_ID ,r.SignatureCPA1Id,r.SignatureCPA2Id

from Base_Staff S

left join Rpt_RegistForm R

on ( R.SignatureCPA1Id=S.Id or R.SignatureCPA2Id=S.Id ) and r.DocStatus=30

where s.UserType=3

)

select t0.*

,(

Select COUNT(*) from (

Select Distinct BusinessBackupId

from Biz_BusinessBackupCustomer b

inner join CTE on b.Id =CTE.BusinessBackupCustomerId

where t0.AccountantCode=CTE.AccountantCode

) t1

) as '约定书数'

from

(

select Name, AccountantCode,COUNT( BusinessBackupCustomerId) as '报告数'

from CTE

group by Name,AccountantCode

) t0

执行此查询,只需要5秒钟时间,比原来的查询提高了一倍。

注意上面的Count函数,它统计了一个列,如果该列在某行的值为NULL,将不会统计该行,这正符合需求。

另外,CTE还可以做递归处理,详细见上面的联机丛书URL的内容说明。

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

TAG标签:问题

mysql cte 表不存在_使用CTE解决复杂查询的问题_MySQL相关推荐

  1. mysql数据表交叉引用_数据定义语句

    数据定义语句 MySQL 8.0支持原子数据定义语言(DDL)语句.此功能称为原子DDL.原子DDL语句将数据字典更新,存储引擎操作和与DDL操作相关联的二进制日志写入操作组合到单个原子事务中.即使事 ...

  2. mysql 跳表 b 树_简单谈谈Mysql索引与redis跳表

    摘要 面试时,交流有关mysql索引问题时,发现有些人能够涛涛不绝的说出B+树和B树,平衡二叉树的区别,却说不出B+树和hash索引的区别.这种一看就知道是死记硬背,没有理解索引的本质.本文旨在剖析这 ...

  3. mysql大表数据抽取_从云数据迁移服务看MySQL大表抽取模式

    摘要:MySQL JDBC抽取到底应该采用什么样的方式,且听小编给你娓娓道来. 小编最近在云上的一个迁移项目中被MySQL抽取模式折磨的很惨.一开始爆内存被客户怼,再后来迁移效率低下再被怼.MySQL ...

  4. mysql 收藏表如何建立_代码收藏系列--mysql创建数据库、数据表、函数、存储过程命令...

    创建mysql数据库 CREATE DATABASE IF NOT EXISTS `database_name` DEFAULT CHARSET utf8 COLLATE utf8_general_c ...

  5. mysql数据表添加列_如何将列添加到MySQL表

    mysql数据表添加列 The command add column is used to add an additional column to any given MySQL table. 命令a ...

  6. mysql创表的工种_[MySQL基础]七、连接查询

    含义:又称为多表查询,当查询的字段来自多个表时,就会用到连接查询 笛卡尔乘积现象 表1 有m行,表2有n行,结果为m*n行 发生原因:没有有效的连接条件. 如何避免:添加有效的连接条件. 案例:在bo ...

  7. mysql 单表2000多万条数据,模糊查询如何秒回

    mysql 单表数据2000多万,没有分区.没有表.没有分库,表存储的是企业信息,例如:企业名称.经营范围.注册地址等信息.现在需要通过关键词模糊匹配企业名称,搜索出匹配的数据.因为模糊匹配,所以直接 ...

  8. mysql创建表属性引_【学习之Mysql数据库】mysql数据库创建表的属性详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 MySQL中create table语句的基本语法是: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name ...

  9. java mysql修改表结构字段_【开发技术】java+mysql 更改表字段的步骤

    1).首先通过SQL更改MYSQL库中的表结构(下面是一些例子) ALTER TABLE `illegalactivate` ADD `macethaddress` varchar(250)  NOT ...

最新文章

  1. 什么是Terraform?
  2. ECCV 2018 StructSiam:《Structured Siamese Network for Real-Time Visual Tracking》论文笔记
  3. 多语言持久性:带有MongoDB和Derby的EclipseLink
  4. SQLAlchemy 教程 —— ORM 方式使用示例
  5. CentOS 6系统启动流程细微解读,不可忽略引导扇区的1.5阶段。
  6. mysql for python 64_解决windows64位系统上安装mysql-python报错
  7. angular监听输入框值的变化_angular 实时监听input框value值的变化触发函数方法
  8. java 常用集合list与Set、Map区别及适用场景总结
  9. 简单的php文件_超简单的php文件上传程序
  10. 【干货】js 数组操作合集(前端自我修养)
  11. Windows下编译DCMTK
  12. 浏览器主页被hao123、360导航之类的流氓网址劫持解决方法
  13. 云计算机应用论文,关于云计算应用的研究(本科毕业论文)
  14. 一条Insert语句怎么优化和解构
  15. tensorflow-gpu深度学习安装的一系列问题——>解决方法汇总
  16. ubutun 滑动 触控板_Ubuntu下触控板手势调节软件xSwipe
  17. 绎维软件F-One获得B轮融资,华创资本领投,齐银基金跟投...
  18. 一种防山火在线监测装置
  19. 微信好友互删服务器还会有记录吗,微信好友互删后还能恢复吗?一招轻松搞定...
  20. 如何把一个大的视频压缩变小

热门文章

  1. WebPart的三种部署方法
  2. Apriori算法进行关联分析(1)
  3. 严重: StandardServer.await: create[8005]:
  4. 自动ping博客服务程序
  5. ext中fieldLabel文本太宽的问题,以及Panel居中显示
  6. RabbitMQ的消息确认ACK机制
  7. Django在根据models生成数据库表时报 missing 1 required positional argument on_delete(亲测)
  8. phpstorm+Xdebug断点调试PHP
  9. git push 代码报错 Pushing to Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
  10. Homestead 集成开发环境配置