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
相关产品推荐
相关产品推荐

