SQL JOIN后GROUP BY查询提示选择列表列无效错误如何解决
报错原因
SQL标准中GROUP BY语法有强制要求:SELECT子句中出现的非聚合函数字段,必须全部包含在GROUP BY子句中。你当前仅按B.VARCHAR01、B.VARCHAR02两个字段分组,但SELECT里的A.CODE、A.NAME既没有用聚合函数包裹,也没有加入GROUP BY,数据库无法确定同分组内多个不同的CODE/NAME值返回哪一个,因此触发报错。
解决方案
方案1:子查询关联法(兼容所有数据库)
先通过分组查询拿到每个VARCHAR01+VARCHAR02分组下的最小ID,再关联原表取出对应行的完整字段:
SELECT A.ID, A.CODE, A.NAME, B.VARCHAR01, B.VARCHAR02 FROM PRODUCTS A INNER JOIN EXTRAS B ON A.ID = B.ID INNER JOIN ( -- 先查询每个分组的最小ID SELECT MIN(A1.ID) AS MIN_ID FROM PRODUCTS A1 INNER JOIN EXTRAS B1 ON A1.ID = B1.ID WHERE A1.COMPANY = 1002 AND A1.TYPE = 50 GROUP BY B1.VARCHAR01, B1.VARCHAR02 ) T ON A.ID = T.MIN_ID WHERE A.COMPANY = 1002 AND A.TYPE = 50
方案2:窗口函数法(兼容MySQL8.0+、SQL Server、PostgreSQL、Oracle等主流新版数据库)
用ROW_NUMBER()窗口函数给每个分组内的行按ID从小到大排序,取排序为1的行即可:
SELECT ID, CODE, NAME, VARCHAR01, VARCHAR02 FROM ( SELECT A.ID, A.CODE, A.NAME, B.VARCHAR01, B.VARCHAR02, -- 按两个分组字段分区,ID升序排序,最小ID的行编号为1 ROW_NUMBER() OVER(PARTITION BY B.VARCHAR01, B.VARCHAR02 ORDER BY A.ID ASC) AS RN FROM PRODUCTS A INNER JOIN EXTRAS B ON A.ID = B.ID WHERE A.COMPANY = 1002 AND A.TYPE = 50 ) T WHERE RN = 1
如果需要处理同分组下有多个相同最小ID的场景,把ROW_NUMBER()换成RANK()即可。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

