SQL实现:查询拥有最长总边境线的州名
查询总边境线最长州的正确SQL实现
针对你的需求,以下是修正后的SQL方案,同时会说明原语句的问题所在:
正确SQL代码
方法1:合并边境记录后汇总排序
SELECT s.name, SUM(b.length) AS total_border_length FROM state s INNER JOIN ( -- 将每条边境记录分别映射到两个关联州 SELECT code1 AS state_code, length FROM borders UNION ALL SELECT code2 AS state_code, length FROM borders ) b ON s.code = b.state_code GROUP BY s.code, s.name ORDER BY total_border_length DESC LIMIT 1;
方法2:使用窗口函数处理(支持多州并列最长的场景)
如果存在多个州总边境长度相同且均为最大值的情况,窗口函数可以保留所有符合条件的州:
WITH state_border_totals AS ( SELECT s.name, SUM(b.length) AS total_border_length, RANK() OVER (ORDER BY SUM(b.length) DESC) AS rank_num FROM state s INNER JOIN ( SELECT code1 AS state_code, length FROM borders UNION ALL SELECT code2 AS state_code, length FROM borders ) b ON s.code = b.state_code GROUP BY s.code, s.name ) SELECT name, total_border_length FROM state_border_totals WHERE rank_num = 1;
原SQL语句的问题解析
- 边境记录遗漏:原语句仅关联
borders表的code1字段,忽略了code2对应的州,导致该州的部分边境长度未被统计,最终结果不准确。 - 聚合函数使用错误:
- 直接在
WHERE子句中调用SUM(b.length)是非法的,聚合函数必须配合GROUP BY分组后使用,筛选聚合结果应使用HAVING子句。 - 原语句未对州进行分组,也没有排序或限制逻辑,无法筛选出总长度最长的州。
- 直接在
- 表名拼写错误:原语句中
boarder应为borders。
内容的提问来源于stack exchange,提问作者Vin rich
相关产品推荐
相关产品推荐

