使用子查询与INNER JOIN时表别名无法识别问题排查
问题解答
报错原因
SQL中的表别名生效范围是仅在定义它的查询块内部有效,你在统计骑行次数的子查询括号内,给citibike_trips表定义了别名trips,这个别名只能在该括号内的子查询逻辑中使用,外层JOIN属于父查询块,自然无法识别到子查询内部定义的别名,所以会抛出Unrecognized name: trips的错误。
另外你原查询还存在几个逻辑问题:子查询整体的别名和统计字段别名混淆、排序字段名与实际返回字段不匹配、关联字段取值来源错误。
修正后的查询语句
SELECT stations.station_id, stations.name, ride_stats.number_of_rides AS num_of_rides_starting_at FROM ( SELECT start_station_id, COUNT(*) number_of_rides FROM bigquery-public-data.new_york_citibike.citibike_trips AS trips GROUP BY trips.start_station_id ) AS ride_stats INNER JOIN bigquery-public-data.new_york_citibike.citibike_stations AS stations ON stations.station_id = ride_stats.start_station_id ORDER BY ride_stats.number_of_rides DESC
调整说明
- 子查询内部的
trips别名仅在子查询分组逻辑中使用,外层不需要访问该别名 - 给统计子查询设置了独立别名
ride_stats,外层关联、字段取值、排序操作,都通过该别名调用子查询返回的字段即可 - 统一了字段别名的引用逻辑,修正了原查询的语法、逻辑错误
内容的提问来源于stack exchange,提问作者benjaminestrada
相关产品推荐
相关产品推荐

