JOIN语句语法错误排查:提取各洲最低Quant对应国家名失败
问题:提取各洲Quant值最低的国家名称时JOIN语句报错
表格数据:
| continent | name | Quant |
|---|---|---|
| Asia | SL | 140 |
| Asia | Iran | 56 |
| Asia | Iraq | 43 |
| Europe | Italy | 60 |
| Europe | Spain | 38 |
| Europe | Eire | 12 |
| Africa | Kenya | 56 |
| Africa | Zaire | 34 |
| Africa | Egypt | 130 |
尝试的SQL语句及报错
语句1:
SELECT y.continent, x.name, MIN(y.Quant) FROM golf y GROUP By y.continent LEFT JOIN golf x ON (y.continent = x.continent)
替代写法:
SELECT y.continent, x.name, min(y.Quant) FROM golf y GROUP BY y.continent LEFT OUTER JOIN (select x.continent, x.name FROM golf x) ON (y.continent = x.continent)
报错信息:
db error: ERROR: syntax error at or near "left"
语法错误原因
SQL的执行顺序是FROM/JOIN → WHERE → GROUP BY → SELECT → ORDER BY,你把GROUP BY放在了JOIN之前,违反了语法规则。JOIN属于FROM子句的一部分,必须放在GROUP BY语句之前。
另外,就算调整顺序,当前的关联逻辑也无法实现需求——直接关联同表会让每个大洲的所有国家都被匹配,无法精准定位到Quant值最低的国家。
正确实现方案
方法1:使用窗口函数(推荐)
窗口函数可以按大洲分组后对Quant排序,直接筛选出每个组内最小Quant对应的行:
SELECT continent, name, Quant FROM ( SELECT continent, name, Quant, ROW_NUMBER() OVER (PARTITION BY continent ORDER BY Quant ASC) AS rn FROM golf ) t WHERE rn = 1;
PARTITION BY continent:按大洲对数据分组ORDER BY Quant ASC:让每个组内Quant值最小的行排在第一位rn=1:筛选出每个组的第一行,即Quant值最低的国家
方法2:子查询+JOIN
先计算各洲的最低Quant值,再关联原表匹配对应的国家:
SELECT g.continent, g.name, g.Quant FROM golf g JOIN ( SELECT continent, MIN(Quant) AS min_quant FROM golf GROUP BY continent ) t ON g.continent = t.continent AND g.Quant = t.min_quant;
- 子查询先得到每个大洲的最低Quant值
- 通过大洲名称和Quant值匹配,找到对应的国家记录
内容的提问来源于stack exchange,提问作者Abi
相关产品推荐
相关产品推荐

