【问题标题】:Group by alias (Oracle)按别名分组 (Oracle)
【发布时间】:2008-11-06 12:04:11
【问题描述】:

如何使用别名对查询进行“分组”,例如:

select count(*), (select * from....) as alias_column 
from table 
group by alias_column

我收到 'alias_column' : INVALID_IDENTIFIER 错误消息。为什么?如何对这个查询进行分组?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:
    select
      count(count_col),
      alias_column
    from
      (
      select 
        count_col, 
        (select value from....) as alias_column 
      from 
        table
      ) as inline
    group by 
      alias_column
    

    如果您在 GROUP BY 子句中重复相应的表达式,分组通常会起作用。只提及别名是不可能的,因为 SELECT 步骤是执行查询的最后一步,分组发生在更早的时候,当时还没有定义别名。

    要对子查询的结果进行 GROUP BY,您必须绕道而行并使用嵌套查询,如上所述。

    【讨论】:

      【解决方案2】:

      用别名列嵌套查询:

      select count(*), alias_column
      from
      ( select empno, (select deptno from emp where emp.empno = e.empno) as alias_column
        from emp e
      )
      group by alias_column;
      

      【讨论】:

        【解决方案3】:
        select count(*), (select * from....) as alias_column 
        from table 
        group by (select * from....)
        

        在 Oracle 中,您不能在 group by 子句中使用别名。

        【讨论】:

          【解决方案4】:

          要在 Oracle 中使用别名,您需要确保该别名已由您的查询在使用别名时定义。

          最直接的方法是简单地将原始查询视为子查询——在这种情况下,

          select count(*), (select * from....) as alias_column 
          from table 
          group by (select * from....)
          

          变成

          select count, alias_column 
          from
            (select count(*) as count, (select * from....) as alias_column 
            from table)
          group by alias_column 
          

          我无法谈论对性能的影响,但如果您尝试在查询中重用别名,写起来会非常快 - 将所有内容放在括号中并提升一个级别...

          【讨论】:

            【解决方案5】:

            如果您不必使用别名,您可以这样做:

            select  
            EXTRACT(year from CURRENT_DATE), count(*) from something
            group by EXTRACT(year from CURRENT_DATE)
            order by EXTRACT(year from CURRENT_DATE)
            

            而不是使用别名和子查询。

            【讨论】:

              猜你喜欢
              • 2021-03-04
              • 2013-03-08
              • 1970-01-01
              • 2019-09-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多