错误代码 1248,SQL 状态 42000:每个派生的 table 必须有自己的别名

Error code 1248, SQL state 42000: Every derived table must have its own alias

我 运行 这个查询 MySQL。

Select Vendor, sum(Rate) as Rate
from (select case Vendor when 'NSN' then 'Nokia' else Vendor end as Vendor, Rate
from (  Select vendor ,(count(1) )*100/(Select count(id_incident)from incident where open_time between '2015-01-01'and'2015-01-30') as Rate from incident  where open_time between '2015-01-01'and'2015-01-30'group by upper (vendor) )) as y group by vendor;   

它给出了这个错误:

Error code 1248, SQL state 42000: Every derived table must have its own alias".

有什么问题?

您忘记为内部子查询指定别名。我选择了x

Select Vendor, sum(Rate) as Rate
from 
(
   select case Vendor when 'NSN' then 'Nokia' else Vendor end as Vendor, Rate
   from 
   (  
     Select vendor ,(count(1) )*100/(Select count(id_incident)from incident where open_time between '2015-01-01'and'2015-01-30') as Rate 
     from incident  
     where open_time between '2015-01-01'and'2015-01-30'
     group by upper (vendor) 
   ) as x
) as y 
group by vendor;   

您的查询比需要的复杂得多:

 Select (case when vendor = 'NSN' then 'NOKIA' else upper(vendor) end) as vendor,
        count(*)*100 / overall.cnt as Rate 
 from incident i cross join
      (Select count(*) as cnt
       from incident
       where open_time between '2015-01-01'and'2015-01-30'
      ) overall
 where open_time between '2015-01-01'and'2015-01-30'
 group by (case when vendor = 'NSN' then 'NOKIA' else upper(vendor) end)

评论:

  • 子查询(在 MySQL 中)会产生用于实现中间结果的额外开销。
  • select 子句中的子查询为每一行调用一次。在from中,只计算一次。
  • 如果 id_incident 不为 NULL,则只需使用 count(*)(或 count(1))。当您没有真正检查 NULL 值时,在 count() 中放置一列会产生误导。