MySQL报错Every derived table must have its own alias,求解决
问题解决:Every derived table must have its own alias 错误
错误原因分析
你的SQL触发错误的核心原因是第二个派生表(计算首次触点数据的子查询)没有指定别名,MySQL要求所有派生表必须有自己的别名才能被引用。除此之外还有两处问题需要修正:
- 关联条件中引用的
b.customer_id无效:b是内层子查询的表别名,外层无法直接访问,必须用派生表的别名来关联 min(b.timestamp)未指定别名,后续无法正常引用;同时在MySQL严格模式(开启ONLY_FULL_GROUP_BY)下,marketing_source和marketing_medium既不在GROUP BY中也没有聚合函数包裹,会触发语法错误
修正后的SQL语句
select * from sessions as a join ( select b.customer_id, min(b.timestamp) as first_touch_timestamp, min(b.marketing_source) as first_touch_source, min(b.marketing_medium) as first_touch_medium from sessions as b group by b.customer_id ) as first_touches on a.customer_id = first_touches.customer_id
关键修正点说明
- 给计算首次触点的子查询添加了别名
first_touches,满足派生表必须有别名的要求 - 给
min(b.timestamp)指定别名first_touch_timestamp,方便后续引用 - 用
min()包裹marketing_source和marketing_medium,适配MySQL的ONLY_FULL_GROUP_BY模式(因为同一个customer_id的首次记录对应的这两个字段是唯一的,用min或max不影响结果) - 简化了外层嵌套结构,去掉不必要的括号,让SQL更简洁易读
内容的提问来源于stack exchange,提问作者Mohamed Hédi Lassoued
相关产品推荐
相关产品推荐

