当前位置: 首页 > article >正文

Sql中WITH的作用

1. WITH 子句:公共表表达式 (CTE)

WITH 子句是 SQL Server(以及许多现代数据库系统)中支持的功能,用于定义 公共表表达式(CTE)。CTE 是一个临时的结果集,查询在执行过程中可以像表一样引用它。

在你的例子中,WITH 子句定义了一个临时的查询结果,称为 RankedAttendance。这部分查询将用于后续的主查询。

  • RankedAttendance是你给公用表表达式(CTE)取的名字。
  • 在 WITH 后面的大括号内,可以写一个普通的 SQL 查询,这个查询将返回一个结果集,作为 CTE 的内容。
  • 在查询的后续部分,你可以像引用普通表一样引用这个 CTE。
WITH RankedAttendance AS ( 
-- CTE 查询部分 
SELECT PersonID, AttendanceDate, AttendanceStatus,
 ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY AttendanceDate DESC) AS RowNum 
FROM a )

2. CTE 的作用

CTE 中的查询为每个 PersonID(即每个人)根据 AttendanceDate(考勤日期)降序排序,使用了 ROW_NUMBER() 窗口函数来给每个考勤记录分配一个行号。ROW_NUMBER() 根据 PARTITION BY PersonIDORDER BY AttendanceDate DESC 排序,使得每个人的最新记录会被分配 RowNum = 1

  • ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY AttendanceDate DESC)
    这个窗口函数会按照 PersonID 分组,并对每组按 AttendanceDate 降序排列,为每个考勤记录分配一个唯一的行号(从 1 开始)。

    • PARTITION BY PersonID:表示按 PersonID 对数据进行分组,确保每个人的考勤记录被单独排序。
    • ORDER BY AttendanceDate DESC:对每个人的考勤记录按日期降序排列,确保最新的考勤记录排在最前面。

3. 主查询:从 CTE 中提取最新记录

SELECT PersonID, AttendanceDate, 
AttendanceStatus FROM RankedAttendance WHERE RowNum = 1;

在主查询中,我们从 CTE(RankedAttendance)中选择 PersonIDAttendanceDateAttendanceStatus,并且使用 WHERE RowNum = 1 来过滤出每个人的最新一条考勤记录,因为每个人的最新记录的 RowNum 为 1。

总结:WITH 子句的作用

  • WITH 子句 定义了一个 公共表表达式(CTE),这个 CTE 临时存储了每个人的考勤记录,并为每条记录分配了一个按日期降序排列的行号。
  • 主查询从这个 CTE 中获取了每个人的最新考勤记录,即 RowNum = 1 的记录。

为什么使用 CTE?

  1. 提高可读性:CTE 提供了一种清晰的方式来分解复杂的查询,使得整个查询的结构更加易于理解。通过先定义 CTE,主查询变得更加简洁。

  2. 简化多次引用:CTE 允许你在查询中多次引用相同的结果集,而不需要重复编写相同的子查询。

  3. 递归查询:CTE 也可以用于递归查询,这对于处理层级结构(如组织结构、目录树等)非常有用。


http://www.kler.cn/a/469440.html

相关文章:

  • Windows 11 上通过 WSL (Windows Subsystem for Linux) 安装 MySQL 8
  • RedisTemplate执行lua脚本及Lua 脚本语言详解
  • 倾斜摄影相机在不动产确权登记和权籍调查中的应用
  • OSPF - 影响OSPF邻居建立的因素
  • Vue2中使用Echarts
  • 【大模型】7 天 AI 大模型学习
  • pygame飞机大战
  • SpringMVC(二)原理
  • 【QT】C++线程安全的单例模板
  • Docker容器中Elasticsearch内存不足问题排查与解决方案
  • 【车载网络】BUSOFF状态简述和制造
  • Go语言的 的输入/输出流(I/O Streams)核心知识
  • LeetCode:700.二叉搜索树中的搜索
  • ThreadLocal` 的工作原理
  • Apache zookeeper集群搭建
  • Java-数据结构-时间和空间复杂度
  • Python 标准库:hashlib——安全哈希与消息摘要
  • ARM CCA机密计算安全模型之加密建议
  • 26 go语言(golang) - GC原理
  • 系统架构师考试-MDA模型驱动架构
  • Mac 版本向日葵退出登录账号
  • Electron快速入门——跨平台桌面端应用开发框架
  • 嵌入式linux中socket控制与实现
  • Mono里运行C#脚本24—handle_ctor_call
  • 【Unity3D】UGUI Canvas画布渲染流程
  • 【NLP高频面题 - Transformer篇】Transformer编码器有哪些子层?