You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需Left Join,通过单查询获取同一表的聚合统计结果?

优化SQL查询:无需LEFT JOIN的单语句实现

你的需求是查询每个学生的每一条分数记录,同时附上该学生所有不同分数的数量,原写法通过LEFT JOIN子查询实现,确实可以优化成单条查询,用窗口函数就能搞定,不需要额外的子查询和JOIN操作。

优化后的SQL语句如下:

SELECT 
    student_id,
    marks,
    COUNT(DISTINCT marks) OVER (PARTITION BY student_id) AS d_marks
FROM student_marks;

为什么这样更优?

  • 原写法需要对student_marks表扫描两次(一次外层查询,一次子查询分组),而窗口函数只需要一次扫描,性能更优
  • 代码逻辑更直观,不需要额外的JOIN关联,减少冗余语法
  • 窗口函数的PARTITION BY student_id会按学生ID分组计算聚合值,COUNT(DISTINCT marks)统计每个学生的不同分数数量,结果会自动匹配到每一行对应的学生记录上

注意:部分老版本数据库可能对窗口函数中的COUNT(DISTINCT)支持有限(比如MySQL 8.0之前的版本),如果你的数据库版本不支持,可以用替代方案:先通过子查询计算每个学生的不同分数数,再用窗口函数关联——不过这种情况还是建议优先升级数据库版本,或者用原写法的等价优化,但多数现代关系型数据库(PostgreSQL、MySQL 8.0+、SQL Server等)都支持窗口函数中的COUNT(DISTINCT)。

内容的提问来源于stack exchange,提问作者Suhail Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:05:37