T-SQL使用JOIN、聚合与GROUP BY时出现外部引用报错如何解决
报错根因
- 第一次报错违反了SQL分组查询的基础规则:
SELECT子句中所有未包裹聚合函数的字段,必须全部出现在GROUP BY子句中。你第一次查询的姓名、预订ID都没有使用聚合函数,仅按Guest_ID分组不符合语法要求。 - 第二次报错是因为
GROUP BY中写的'Guest Name'被单引号标记为字符串常量,并非你定义的字段别名,且SQL Server、Oracle等多数数据库不支持在GROUP BY中直接引用SELECT阶段定义的别名,因此分组条件无效触发报错。
正确查询语句
SELECT [Guests].FirstName + ' ' + [Guests].LastName AS 'Guest Name', COUNT([ReservationsRooms].Reservation_ID) AS 'Reservations' FROM [ReservationsRooms] JOIN [Reservations] ON [ReservationsRooms].Reservation_ID = [Reservations].Reservation_ID JOIN [Guests] ON [Reservations].Guest_ID = [Guests].Guest_ID GROUP BY [Guests].Guest_ID, [Guests].FirstName, [Guests].LastName
写法说明
- 按
Guest_ID、FirstName、LastName三个字段分组,完全符合SQL分组语法规则,Guest_ID作为客人表主键可以保证分组不会重复,加姓名字段是为了匹配SELECT中的非聚合字段要求。 COUNT函数会统计每个客人对应的有效预订记录数,最终返回的结果恰好是你需要的Reservations、Guest Name两列,和示例输出格式完全匹配。
内容的提问来源于stack exchange,提问作者Craig Johnson
相关产品推荐
相关产品推荐

