如何编写SQL优先取覆盖费率,无则取默认费率?解决派生表别名错误
解决SQL报错「every derived table must have its own alias」并实现费率优先查询
报错原因
你写的这段SQL里,作为派生表的子查询没指定别名,SQL语法要求所有派生表必须有自己的别名,所以才会报这个错。
简化场景的修正查询(对应你最初的A、B表结构)
只需要给子查询加个别名就能解决报错:
select t.id, t.rate from ( select A.id, coalesce(B.rate, A.rate) as rate from A left join B on B.id = A.id ) as t; -- 给子查询添加别名t
实际业务场景的完整SQL
结合你提供的示例数据,要实现「优先用个人覆盖费率,没有的话用活动默认费率」的需求,得关联所有相关表,完整SQL如下:
select u.name, at.description, a.qty, coalesce(por.rate, at.rate) as final_rate from activities a join user u on a.user_id = u.user_id join activity_types at on a.activity_type_id = at.activity_type_id left join personal_override_rates por on a.user_id = por.user_id and a.activity_type_id = por.activity_type_id order by u.name, at.description;
关键说明
- 用
LEFT JOIN关联personal_override_rates,保证就算没有个人覆盖费率的记录,活动数据也能保留 COALESCE(por.rate, at.rate)会优先取个人覆盖费率,要是这个值不存在(也就是没覆盖记录),就自动用活动默认费率- 直接关联所有表就能拿到用户名称、活动描述、数量这些字段,比嵌套子查询更简洁
执行结果
跑上面的SQL,就能得到你要的结果:
johnny cook steak 1 $18.00 johnny flip burgers 1 $9.00 sam cook steak 1 $12.00 sam flip burgers 1 $9.00
内容的提问来源于stack exchange,提问作者markhorrocks
相关产品推荐
相关产品推荐

