sql 交叉查询

article/2025/5/14 12:00:08

 

日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求。比如,左表一条关联右表多条记录时,我需要控制右表的某一条多条记录跟左表匹配。貌似,INNER JOIN 或 LEFT OUTER JOIN 不能很好完成。但是 CROSS APPLY 与 OUTER APPLY 可以,下面用示例说明。

 

  1. 示例一
    • 有两张表:Student(学生表)和 Score(成绩表),数据如下:

clip_image002[10]

 

  1. 查询每个学生最近两次的考试成绩
  1. 先试下 INNER JOIN
  1. SQL 代码

SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1

INNER JOIN Score AS T2 ON T1.StudentNo = T2.StudentNo

  1. 结果:

clip_image003[12]

  1. 咦,不对,这不是我想要的结果。

 

  1. 再看看 CROSS APPLY
  1. SQL 代码

SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1

CROSS APPLY(

    SELECT TOP 2 * FROM Score AS T

    WHERE T1.StudentNo = T.StudentNo

    ORDER BY T.ExamDate DESC

) AS T2

  1. 结果:

clip_image004[12]

  1. 嗯,这次对了,并且还是按照“考试时间”倒序排序的。

 

  1. 查询每个学生最近两次的考试成绩,没有参加考试的同学成绩补 null
  1. 先试下 LEFT OUTER JOIN
  1. SQL 代码

SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1

LEFT OUTERJOIN Score AS T2 ON T1.StudentNo = T2.StudentNo

  1. 结果:

clip_image005[12]

  1. 咦,不对,这又不是我想要的结果。

 

  1. 再看看 OUTER APPLY
  1. SQL 代码

SELECT T1.StudentNo, T1.Name, T2.ExamScore, T2.ExamDate FROM Student AS T1

OUTER APPLY(

    SELECT TOP 2 * FROM Score AS T

    WHERE T1.StudentNo = T.StudentNo

    ORDER BY T.ExamDate DESC

) AS T2

  1. 结果:

clip_image006[10]

  1. 嗯,这次对了,不但按照“考试时间”倒序排序的,而且没有考试的同学也被查出来了。

 

  • 总结
  1. 理解 CROSS APPLY 与 OUTER APPLY(个人理解)
  1. CROSS APPLY 的意思是“交叉应用”,在查询时首先查询左表,然后右表的每一条记录跟左表的当前记录进行匹配。匹配成功则将左表与右表的记录合并为一条记录输出;匹配失败则抛弃左表与右表的记录。(与 INNER JOIN 类似)
  2. OUTER APPLY 的意思是“外部应用”,与 CROSS APPLY 的原理一致,只是在匹配失败时,左表与右表也将合并为一条记录输出,不过右表的输出字段为 null。(与 LEFT OUTER JOIN 类似)

 

  1. CROSS APPLY 与 INNER JOIN 的区别
  1. CROSS APPLY 可以根据当前左表的当前记录去查询右表,但是 INNER JOIN 不可以,INNER JOIN 是根据左表的当前记录匹配右表整个结果集。
  2. 两者都是匹配成功才输出。

 

  1. OUTER APPLY 与 LEFT OUTER JOIN 的区别
  1. 它们和(CROSS APPLY 与 INNER JOIN)类似。
  2. 只是两者都是匹配失败也会输出。

 

  1. 使用场景:
  1. 一个商品有多张图片,但是只想取最近的一张图片跟商品匹配。

 

  1. 总结一句话:右表可以是有条件的跟左表的记录匹配,而条件的值可以来至于左表。

http://chatgpt.dhexx.cn/article/1cCo7OTt.shtml

相关文章

交叉表和透视表

交叉表: 用于计算一列数据对于另一列数据的分组个数(用于统计分组频率的特殊透视表) pd.crosstab(value1,value2)透视表:将原有的dataframe的列分别作为行索引和列索引,然后对指定的列应用聚集函数 data.pivot_table() 探究股票的…

【交叉表查询】行列转换的魅力

本文主要是讲一下行列转换,也就是大家经常讲的交叉表查询。 行列转换在实际的应用中非常的实用,可以大大的减少工作量。 很多时候,在Excel中处理数据时,我们需要统计每个月的销量或者需要填写每个月的销量,如下图 &a…

Mysql5 实现交叉表查询

交叉表、行列转换和交叉查询经典 一、什么是交叉表 “交叉表”对象是一个网格,用来根据指定的条件返回值。数据显示在压缩行和列中。这种格式易于比较数据并辨别其趋势。它由三个元素组成: 行 列 摘要字段 “交叉表”中的行沿水平方向延…

access交叉表

一、交叉表查询每门课的成绩 交叉表:左边是行标题,上面是列标题,交叉的是值。更改字段名:更改字段名用双引号 二、查询每个年级的每门课的成绩 [表名]![字段名] 三、生成表 生成表:在一张表上生成一张新表原来只有三张表 点击运行…

access如何查询两张表的内容_Access使用技术2:使用交叉表查询向导进行每日汇总...

个人主页:http://office-access.cn公众号:DataMapHuanyu Access使用技术2:使用交叉表查询向导进行每日汇总 Access交叉表查询可以合并每日的量,日汇总功能对于大量数据统计是很有帮助的,Excel很难胜任。 1.技术要求 将不同的表用Union Select合并到一张表中,不能用两张表…

【Access数据库】关于带参数的交叉表查询

查了一圈,网上关于带参数的交叉表查询的介绍很少。 1.用SQL语句写带参数的交叉表查询的话,不能用having语句设置条件,必须用where。 2.where语句里不能像普通参数查询一样写模糊查询,必须是精确的。 3.即使用了where,也…

在MySQL中实现交叉表查询1(静态交叉表)

在MySQL中实现交叉表查询1(静态交叉表) 一、什么是交叉表 交叉表查询是将来源于某个表中的字段进行分组,一组列在交叉表左侧,一组列在交叉表上部,并在交叉表行与列交叉处显示表中某个字段的各种计算值。比如&#xf…

5.7.1 使用向导创建交叉表查询

示例ACCESS数据库下载链接: https://download.csdn.net/download/ngbshzhn/20979935 使用交叉表查询计算和重构数据,可以简化数据分析,交叉表查询计算数据的总和、平均值、计数或其他类型的总计值,并将它们分组。一组列在数…

5.7.2 使用设计视图创建交叉表查询

交叉表查询由三部分组成,行标题字段、列标题字段和值字段。按照Access的规定,列标题字段和值字段只能各有一个,行标题字段最多可以有3个。 (1)打开“罗斯文”数据库,在“创建”选项卡上的“查询”组中,单击“查询设…

计算机研究生学习路线

一、研究方向 研究方向来源:导师指定、咨询师兄师姐继续沿着他们的方向做深入研究、自己选方向。本节主要介绍自己如何选方向。 1.1paperswithcode 首先,进入The latest in Machine Learning | Papers With Code,我们可以看到主菜单栏&…

本人以及硕士期间研究介绍

读者们大家好 ~ 这篇博客是本人的第一篇博文,我将对自己的研究内容做一下简要的梳理,也欢迎感兴趣的小伙伴和我一起讨论。 ~ 我是一名工科硕士,本科就读于北京理工大学宇航学院,硕士期间申请硕博连读继续…

计算机学硕研究计划,博士研究生学习计划和研究计划

博士研究生学习计划和研究计划 时间是箭,去来迅疾,我们又将有新的学习内容,迎来新的挑战,是时候写学习计划了哦。好的学习计划都具备一些什么特点呢?以下是小编收集整理的博士研究生学习计划和研究计划,仅供参考,希望能够帮助到大家。 为了给博士学习生活开好头,不断学…

中职生职业生涯规划书2000字学计算机,计算机专业中职生职业生涯规划书

计算机专业中职生职业生涯规划书 下面是小编为中职生计算机专业整理的职业生涯规划书范文,供参考。 一、前言 九年义务教育,我们在儿童的懵懂、自由的嬉戏和父母的纵容中,快乐的度过;三年的高中生活,我们在学生们逐渐激烈的竞争、老师日益严肃的面孔和漫天飞舞的试卷中,艰…

python职业规划书_大学生职业规划书

职业生涯规划(简称生涯规划),又叫职业生涯设计,是将个人与组织相结合,在对一个人职业生涯的主客观条件进行测定、分析、总结的基础上,对自己的兴趣、爱好、能力、特点进行综合分析与权衡,结合时…

回忆我的过去一年2020年考研以及研究生规划

目录 一、启发二、回忆考研录(多图警告)(一)大三寒假入门考研(二)大三下学期进入学习状态(三)大三暑假强化巩固知识(四)大四上学期冲刺考试(五&am…

计算机专业读研期间的规划,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 二、关键一步——院校选择 我把各位同学的院校选择阶段分为以上几个阶段,因为考研这一年中,很多人的目标院校并不是固定不变的,而是随着不同阶段而改变的。学长我在大三下学期这一时间段内也多次…

源代码分析

/**/ // // 制作一个定时器,2位显示秒,2位显示分,用4个调节按钮调节 // 四个调节按钮为key0, key1, key2, key3分别为P3.2, P3.3, P3.4, P3.5 // 数码管用P0显示a,b,c,d,e,f,g,分别对应P0.0, P0.1, P0.2, P0.3, P0.4, P0.5, P0.6,…

IntelliJ IDEA 智能代码分析

IntelliJ IDEA 智能代码分析 # IntelliJ IDEA 会分析你的代码,在项目中查找文件和语言之间的关联。并使用这些信息,向你提供深度的代码帮助,快速导航,以及错误分析和重构。 1. IDEA的智能完成功能 // 按Ctrl+Shift+Space可以触发 // 通过Ctrl+Shift+Space快捷键组合,I…

Understand: 静态代码分析神器

一直以来,我以为Source Insight的代码分析已经是业界最强、最专业。今天试用了一下Scitools的Understand,导入代码后直接可以生成图形化分析结果,包括模块间调用,函数调用流程等,确实比较震撼。 文章目录 1. 设置2. 导…

RTMPdump 源代码分析 1: main()函数

RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: main()函数 RTMPDump (libRTMP) 源代码分析2:解析RTMP地址——RTMP_ParseURL() RTMPdump (libRTMP) 源代码分析3: AMF编码 RTMPdump (libRTMP) 源代码分析4&am…