MySQL嵌套查询疑问:为何不能这样编写部门前三薪资查询语句?
你的查询语句无法执行的原因分析
你的语句存在多个语法和逻辑错误,逐一拆解如下:
1. DISTINCT 语法位置错误
在子查询 select e2.departmentId, distinct e2.salary 中,DISTINCT 是用来修饰整个查询结果的去重规则,必须放在 SELECT 关键字之后、所有列字段之前,正确写法应为 select distinct e2.departmentId, e2.salary,否则会直接触发语法报错。
2. GROUP BY 使用逻辑错误
你用 group by e2.departmentId 对部门分组,但 SELECT 中同时出现了未被聚合处理的 e2.salary。在MySQL默认开启的ONLY_FULL_GROUP_BY模式下,这种写法会直接报错——分组后仅允许选择分组字段,或通过聚合函数(如MAX、MIN)处理后的其他字段。而且即使强制关闭该模式,分组后每个部门也只会返回一条薪资记录,完全无法实现"获取各部门前三薪资"的需求。
3. LIMIT 3 作用范围错误
你的内层子查询的 limit 3 是对整个Employee表的查询结果做全局限制,只会返回全表薪资最高的3条记录,而非每个部门各自的Top3薪资,这和需求逻辑完全不符。正确语句中是通过关联外部的e1.departmentid,为每个部门单独查询其Top3薪资。
4. IN 子查询返回多列错误
e1.salary in (...) 要求子查询必须返回单列数据,但你的子查询返回了e2.departmentId和e2.salary两列数据,这会触发"Operand should contain 1 column(s)"的报错,因为IN只能匹配单列值。
内容的提问来源于stack exchange,提问作者Kimbo
相关产品推荐
相关产品推荐

