Sqlserver 使用CTE如何按子查询排序?

Sqlserver 使用CTE如何按子查询排序?

需求:查出最近有更改的客户信息(按最后更改时间排序,来自SystemLog表LogDateTime字段)

说明:

Customer:客户信息表
SystemLog:系统日志表,记录所有表信息的增,删,改

自己公司开发的行业软件,不仅自己公司有在用,其他公司也在用,本公司进行软件维护和提供升级服务
由于之前的设计客户信息表并没有更改时间字段,而现在该系统已经在N个不同的数据库里运行
导致不能随意更改数据库结构(虽然可以升级,但代价太大)

不能使用视图及存储过程只能使用Sql语句

我写的Sql及效果,虽然可以实现效果,但Sqlsrever的执行计划和IO情况很糟糕

(个人理解SystemLog查询了再次)

--客户信息按照最后更改时间排序:


1

2

3

4

5

6

7

8

WITH _temp AS(SELECT

CustomerId

,CompanyName

,(SELECT TOP 1 LogDateTime FROM SystemLog WHERE LogType=‘更改‘ AND LogTable=‘Customer‘ AND Rid=CustomerId ORDER BY ID DESC )AS ed

,ROW_NUMBER() OVER ( ORDER BY (SELECT TOP 1 LogDateTime FROM SystemLog WHERE LogType=‘更改‘AND LogTable=‘Customer‘ AND Rid=CustomerId ORDER BY ID DESC ) DESC ) as RowNumber

FROM Customer

WHERE CustomerStatus=18

)SELECT * FROM _temp WHERE RowNumber BETWEEN 0 AND 10 ORDER BY ed DESC

  

查询客户信息的系统日志

SELECT TOP 10 s.Rid AS CustomerId, CompanyName , s.LogDateTime
FROM SystemLog s
LEFT JOIN Customer c ON s.Rid=CustomerId
WHERE LogType=‘更改‘AND LogTable=‘Customer‘
AND c.CustomerStatus=18
ORDER BY s.id DESC

set statistics io on;

(10 行受影响)
表 ‘SystemLog‘。扫描计数 2,逻辑读取 1697 次,物理读取 0 次,预读 7 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ‘Worktable‘。扫描计数 155,逻辑读取 50916 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ‘Customer‘。扫描计数 1,逻辑读取 19 次,物理读取 0 次,预读 1 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(1 行受影响)

(10 行受影响)
表 ‘Customer‘。扫描计数 0,逻辑读取 157 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ‘SystemLog‘。扫描计数 1,逻辑读取 73 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(1 行受影响)

请问各位有何优化方法?万分感谢

时间: 2024-12-25 10:42:23

Sqlserver 使用CTE如何按子查询排序?的相关文章

sqlserver中的 数据转换 与 子查询

原文:sqlserver中的 数据转换 与 子查询 数据类型转换 --cast转换 select CAST(1.23 as int) select CAST(1.2345 as decimal(18,2)) select CAST(123 as varchar(10))     整型转换成字符串型 select CAST('123.333' as decimal(18,4))    字符串型转换成浮点型 --convert转换 select CONVERT(int,12.345) 子查询(嵌套查

使用CTE减少统计子查询

Set Statistics IO ON SET STATISTICS TIME ON --/*--原来语句 DECLARE @CkNo nvarchar(4000),@ProWarn int,@SkuWarn intselect @CkNo='D1070',@ProWarn=0,@SkuWarn=0; Select Count(0) From (Select Cak.Pro_Id from Ck_AreaKuc as Cak Where AreaType=1 and [email protec

order by中用子查询排序

今天有个需求是对一个列表排序,但是排序字段是在另一个表中,不想用关联查询,就想能否直接在order by中用子查询,后来找到一个还挺好使.记录如下. 排序语句如下: select * from mainpage_report_sum s where s.year_month = '2019-02' and s.orgid in (select * from (select id from SYS_ORGANIZATION_REPORT o order by o.org_order1 asc));

SQLServer(子查询,存储过程,透视,索引)

存储过程: 视图是对一个查询语句的封装,而存储过程:将一段t-sql脚本进行封装,对一段逻辑操作的封装. 创建存储过程: create proc 名称 参数表 as begin end 案例:去左右空格 creat proc trim @str1 varchar(10)asbegin select LTRIM(RTRIM(@str1)) end 在<可编程性>里面有<存储过程>里面有trim这个名 用的时候: exec trim '参数' 案例:编写存储过程,查询表中的总数居,以及

【SqlServer系列】子查询

1   概述 1.1  已发布[SqlServer系列]文章 [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [SqlServer系列]表连接 1.2  本篇文章内容概要 子查询和表连接,主要是针对两张及以上表之间关联关系进行查询.子查询,按是否独立划分,分为独立子查询和相关子查询:按内部查询返回是否为单值,分为单值子查询(注意:应理解单值子查询和标量子查询关系)和多值子查询:如下表格内容为按子查询是否独立来划分

Oracle基本语法&amp;&amp;函数&amp;&amp;子查询&amp;&amp;分页查询&amp;&amp;排序&amp;&amp;集合操作&amp;&amp;高级分组函数

一.  数据库 手工---文件管理---数据库 DB:Database 数据库. DBMS:管理数据库的软件.(oracle) 主流关系数据库: 1.      Oracle 2.      DB2 3.      SQL Server 基本没人使 4.      MySQL  基本没人用,免费 Linux 开源,可以发现漏洞补上 Windows服务器会有补丁,数据易泄漏 eclipse 日食 数据表(Table): 表的行(Row):记录 表的列(Column):字段 二.  关系型数据库 一

Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页

GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group by deptno; --根据部门分组,并统计 Select deptno, count(*) form emp group by deptno; select deptno, avg(sal) from emp group by deptno; --每个部门的平均工资 HAVING子句 用于指定

【mysql】 mysql 子查询、联合查询、模糊查询、排序、聚合函数、分组----------语法

第二章 mysql 一.模糊查询 like 1. 字段 like '河北省%' %代表任何N个字符 2 字段 like '河北省____' _代表任意1个字符 二.IN 语法:SELECT 字段列1,字段2 ,…FROM 表名 WHERE 字段x IN ( 值1,值2,值3…) 三.排序 语法:select 字段1, 字段2, ... from 表名 where 条件 order by 字段 [asc|desc] asc :升序 desc :降序 默认是升序asc SELECT * FROM s

18 12 06 sql 的 基本语句 查询 条件查询 逻辑运算符 模糊查询 范围查询 排序 聚合函数 分组 分页 连接查询 自关联 子查询

-- 数据的准备 -- 创建一个数据库 create database python_test charset=utf8; -- 使用一个数据库 use python_test; -- 显示使用的当前数据是哪个? select database(); -- 创建一个数据表 -- students表 create table students( id int unsigned primary key auto_increment not null, name varchar(20) default