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

LeetCode SQL问题:两个查询语句的差异及执行结果不同原因解析

嘿,这个问题可是SQL里GROUP BY用法的经典“踩坑点”,我来给你拆解得明明白白:

为什么查询1提交失败,查询2却能通过?

1. 查询1的核心问题:GROUP BY的语义违规

先看你的第一条查询:

SELECT product_id, MIN(year) first_year, quantity, price FROM sales GROUP BY product_id

当你用GROUP BY product_id对数据分组时,SQL的规范要求:SELECT列表里的字段要么是分组字段,要么是被聚合函数处理过的字段。

这里的quantity和price既不是分组字段,也没有被聚合(比如MIN/MAX/SUM),这就会导致两个问题:

  • 严格遵循SQL标准的数据库(比如LeetCode用的)会直接拒绝这个查询,因为它无法确定要返回哪一行的quantity和price(一个产品对应多个年份的销售记录,每个年份的销量价格都不一样)
  • 即使有些宽松的数据库(比如关闭了ONLY_FULL_GROUP_BY的MySQL)允许执行,返回的quantity和price也是随机某一行的值,绝对不是你要的“最小年份对应的销量和价格”,结果完全错误。

这就是为什么你提交这条查询会失败。

2. 查询2的正确逻辑:精准定位目标行

再看第二条查询:

select product_id, year as first_year, quantity, price from Sales 
where (product_id, year) in ( 
    select product_id, min(year) from Sales group by product_id 
)

这个写法的逻辑非常清晰,分两步走:

  • 子查询先完成分组,找出每个product_id对应的最早销售年份MIN(year),得到一组(product_id, 最早年份)的唯一组合
  • 外层查询通过(product_id, year)的组合匹配,从Sales表中精准筛选出每个产品最早年份的那一行完整记录,这样quantity和price自然就是对应年份的正确值,完全符合题目要求。

简单总结:查询1是试图“强行”从分组结果里凑出所有字段,逻辑不严谨;查询2是先锁定正确的行,再取出需要的字段,完全符合SQL语义规范,所以能正确通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 12:29:07