SQL问题求助:查询与建筑平均高度差值小于100米的建筑名称
解决方案
你的SQL语句无法运行主要有两个问题:
- 聚合函数不能直接用在WHERE子句:
AVG(Height)是聚合函数,它是对整个表的行计算结果,而WHERE子句是在聚合前做行级过滤,语法上不允许直接使用聚合函数作为过滤条件。 - 范围逻辑错误:你写的
BETWEEN ABS(AVG(Height)-100) AND ABS(AVG(Height))完全不符合“与平均高度差值小于100米”的需求,正确的范围应该是平均高度减100到平均高度加100。
下面提供两种可行的解决方法:
方法一:使用子查询预先计算平均高度
这是兼容性最好的写法,几乎所有SQL数据库都支持:
SELECT Name FROM building WHERE ABS(Height - (SELECT AVG(Height) FROM building)) < 100;
或者用BETWEEN写法(效果和上面一致):
SELECT Name FROM building WHERE Height BETWEEN (SELECT AVG(Height) FROM building) - 100 AND (SELECT AVG(Height) FROM building) + 100;
方法二:使用窗口函数(适合支持窗口函数的数据库)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),可以用这种方式,还能方便扩展显示平均高度:
SELECT Name FROM ( SELECT Name, Height, AVG(Height) OVER () AS avg_building_height FROM building ) AS building_with_avg WHERE ABS(Height - avg_building_height) < 100;
内容的提问来源于stack exchange,提问作者user20513289
相关产品推荐
相关产品推荐

