[MySQL]错误1248(42000):每个派生表都必须有自己的别名

[MySQL]错误1248(42000):每个派生表都必须有自己的别名,mysql,sql,Mysql,Sql,我试图找出工艺长度的最大值/最小值/平均值/每个配方的步骤数以及使用配方的晶片数。 该表很大,并且是按时间单位记录的,因此存在大量重复数据,如配方或配方步骤。 这是我的代码,请帮助我: select distinct recipe as recipe_id, max(pl) as max_process_length, min(pl) as min_process_length, avg(pl) as avg_process_length, ma

我试图找出工艺长度的最大值/最小值/平均值/每个配方的步骤数以及使用配方的晶片数。 该表很大,并且是按时间单位记录的,因此存在大量重复数据,如配方或配方步骤。 这是我的代码,请帮助我:

select distinct 
    recipe as recipe_id, 
    max(pl) as max_process_length, 
    min(pl) as min_process_length, 
    avg(pl) as avg_process_length, 
    max(steps) as max_number_of_steps, 
    min(steps) as min_number_of_steps, 
    avg(steps) as avg_number_of_steps, 
    count(wfr_id) as number_of_wafers
into outfile 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/process_id.xls'
from 01m02train 
group by recipe
having (
    max(pl) = (
        select max(pt) 
        from (
            select count(time) as pt 
            from 01m02train 
            group by (recipe,wfr_id)
        )
    ) as `maxpl` 
    and min(pl) = (
        select min(pt) 
        from (
            select count(time) as pt 
            from 01m02train 
            group by (recipe,wfr_id)
        )
    ) as `minpl` 
    and avg(pl) = (
        select avg(pt) 
        from (
            select count(time) as pt 
            from 01m02train 
            group by (recipe,wfr_id)
        )
    ) as `avgpl` 
    and max(steps) = (
        select max(rs) 
        from (
            select distinct count(recipe_step) as rs 
            from 01m02train 
            group by (recipe,wfr_id)
        )
    ) as `maxrs` 
    and min(steps) = (
        select min(rs) 
        from (
            select distinct count(recipe_step) as rs 
            from 01m02train 
            group by (recipe,wfr_id)
        )
    ) as `minrs` 
    and avg(steps) = (
        select avg(rs) 
        from (
            select distinct count(recipe_step) as rs 
            from 01m02train 
            group by (recipe,wfr_id)
        )
    ) as `avgrs`
);

在having comparison子句中,放置的位置太多(),并且这些位置不会解析子查询的表名别名

having ( max(pl)=( <----  this must removed 
    select max(pt) from ( 
        select count(time) as pt 
        from 01m02train 
        group by (recipe,wfr_id)
    ) <---- this must removed 
) as `maxpl` 
and min(pl)=( <----  this must removed 
    select min(pt) from (  
        select count(time) as pt 
        from 01m02train 
        group by (recipe,wfr_id) 
      )<---- this must removed 
  ) as `minpl` and
  ..... 
  ....  

having(max(pl)=(在having comparison子句中,您放置的位置太多(),这些不会解析子查询的表名别名

having ( max(pl)=( <----  this must removed 
    select max(pt) from ( 
        select count(time) as pt 
        from 01m02train 
        group by (recipe,wfr_id)
    ) <---- this must removed 
) as `maxpl` 
and min(pl)=( <----  this must removed 
    select min(pt) from (  
        select count(time) as pt 
        from 01m02train 
        group by (recipe,wfr_id) 
      )<---- this must removed 
  ) as `minpl` and
  ..... 
  ....  

having(max(pl)=(主要问题:错误消息非常清楚,您需要对表达式中生成的派生表进行别名。另一方面,对条件进行别名是没有意义的。因此基本上:

max(pl) = (
    select max(pt) 
    from (
        select count(time) as pt 
        from 01m02train 
        group by (recipe,wfr_id)
    )
) as `maxpl` 
应将其拼写为:

max(pl) = (
    select max(pt) 
    from (
        select count(time) as pt 
        from 01m02train 
        group by (recipe,wfr_id)
    ) as `maxpl`
)  
其他问题(它们不会产生错误,但在我看来,仍然值得注意):

  • group by
    子句中枚举的列周围不需要括号(这是多余的)

  • having
    子句中的条件也是如此(除非您将
    混合在一起,而您不这样做)

  • select distinct
    with
    groupby
    没有意义(两者本质上都是聚合)

以下是您的查询的更新版本:

select 
    recipe as recipe_id, 
    max(pl) as max_process_length, 
    min(pl) as min_process_length, 
    avg(pl) as avg_process_length, 
    max(steps) as max_number_of_steps, 
    min(steps) as min_number_of_steps, 
    avg(steps) as avg_number_of_steps, 
    count(wfr_id) as number_of_wafers
into outfile 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/process_id.xls'
from 01m02train 
group by recipe
having 
    max(pl) = (
        select max(pt) 
        from (
            select count(time) as pt 
            from 01m02train 
            group by (recipe,wfr_id)
        ) as `maxpl` 
    ) 
    and min(pl) = (
        select min(pt) 
        from (
            select count(time) as pt 
            from 01m02train 
            group by (recipe,wfr_id)
        ) as `minpl` 
    ) 
    and avg(pl) = (
        select avg(pt) 
        from (
            select count(time) as pt 
            from 01m02train 
            group by (recipe,wfr_id)
        ) as `avgpl` 
    ) 
    and max(steps) = (
        select max(rs) 
        from (
            select count(recipe_step) as rs 
            from 01m02train 
            group by (recipe,wfr_id)
        ) as `maxrs` 
    ) 
    and min(steps) = (
        select min(rs) 
        from (
            select count(recipe_step) as rs 
            from 01m02train 
            group by (recipe,wfr_id)
        ) as `minrs`
    )  
    and avg(steps) = (
        select avg(rs) 
        from (
            select count(recipe_step) as rs 
            from 01m02train 
            group by (recipe,wfr_id)
        ) as `avgrs`
    ) 
;

主要问题:错误消息非常清楚,您需要对表达式中生成的派生表进行别名。另一方面,对条件进行别名是没有意义的。因此基本上:

max(pl) = (
    select max(pt) 
    from (
        select count(time) as pt 
        from 01m02train 
        group by (recipe,wfr_id)
    )
) as `maxpl` 
应将其拼写为:

max(pl) = (
    select max(pt) 
    from (
        select count(time) as pt 
        from 01m02train 
        group by (recipe,wfr_id)
    ) as `maxpl`
)  
其他问题(它们不会产生错误,但在我看来,仍然值得注意):

  • group by
    子句中枚举的列周围不需要括号(这是多余的)

  • having
    子句中的条件也是如此(除非您将
    混合在一起,而您不这样做)

  • select distinct
    with
    groupby
    没有意义(两者本质上都是聚合)

以下是您的查询的更新版本:

select 
    recipe as recipe_id, 
    max(pl) as max_process_length, 
    min(pl) as min_process_length, 
    avg(pl) as avg_process_length, 
    max(steps) as max_number_of_steps, 
    min(steps) as min_number_of_steps, 
    avg(steps) as avg_number_of_steps, 
    count(wfr_id) as number_of_wafers
into outfile 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/process_id.xls'
from 01m02train 
group by recipe
having 
    max(pl) = (
        select max(pt) 
        from (
            select count(time) as pt 
            from 01m02train 
            group by (recipe,wfr_id)
        ) as `maxpl` 
    ) 
    and min(pl) = (
        select min(pt) 
        from (
            select count(time) as pt 
            from 01m02train 
            group by (recipe,wfr_id)
        ) as `minpl` 
    ) 
    and avg(pl) = (
        select avg(pt) 
        from (
            select count(time) as pt 
            from 01m02train 
            group by (recipe,wfr_id)
        ) as `avgpl` 
    ) 
    and max(steps) = (
        select max(rs) 
        from (
            select count(recipe_step) as rs 
            from 01m02train 
            group by (recipe,wfr_id)
        ) as `maxrs` 
    ) 
    and min(steps) = (
        select min(rs) 
        from (
            select count(recipe_step) as rs 
            from 01m02train 
            group by (recipe,wfr_id)
        ) as `minrs`
    )  
    and avg(steps) = (
        select avg(rs) 
        from (
            select count(recipe_step) as rs 
            from 01m02train 
            group by (recipe,wfr_id)
        ) as `avgrs`
    ) 
;

简化问题(参见)。格式良好的SQL更容易阅读和编写。我修改了您的查询。如JARLH评论的,请考虑在下次发布之前自己做……简化问题(查看)。此外,格式良好的SQL更容易阅读和编写。我重新修改了您的查询。如JARLH评论的,请考虑在下次发布之前自己做。