为什么Oracle SQL不允许我们在GROUP BY子句中使用列别名?

Meh*_*lar 26 sql oracle alias group-by

这是我在编写SQL查询时通常面临的情况.我认为编写整个列(例如长整数表达式,带有长参数的求和函数)而不是GROUP BY表达式中的别名会使查询更长,更不易读.为什么Oracle SQL不允许我们在GROUP BY子句中使用列别名?必须有一个重要原因.

Ton*_*ews 45

它不仅仅是Oracle SQL,实际上我认为它符合ANSI SQL标准(尽管我没有参考).原因是SELECT子句在GROUP BY子句之后进行逻辑处理,因此在完成GROUP BY时,别名尚不存在.

也许这个有点荒谬的例子有助于澄清SQL避免的问题和模糊性:

SQL> select job as sal, sum(sal) as job
  2  from scott.emp
  3  group by job;

SAL              JOB
--------- ----------
ANALYST         6000
CLERK           4150
MANAGER         8275
PRESIDENT       5000
SALESMAN        5600
Run Code Online (Sandbox Code Playgroud)


小智 14

我知道这是一个老线程,但似乎用户问题并没有真正解决; 这些解释很好地解释了为什么group by子句不允许你使用别名,但没有给出替代方案.

根据上面的信息,在select子句中的别名存储在内存中之前,不能在组中使用别名,因为group by先运行.因此,对我的观点起作用的简单解决方案是添加一个外部选择,它只选择别名,然后在同一级别进行分组.

例:

SELECT alias1, alias2, alias3, aliasN
FROM
(SELECT field1 as alias1, field2 as alias2, field3 as alias3, fieldN as aliasN
 FROM tableName
 WHERE ' ' = ' ')
GROUP BY alias1, alias2, alias3, aliasN
Run Code Online (Sandbox Code Playgroud)

一旦你看到解决方案就很直接,但是如果你想第一次自己弄清楚PITA的话.

这是我能够从case语句中"分组"派生字段的唯一方法,所以这是一个很好的技巧.

  • 虽然这可能是一个"解决方案",但它确实要求DB无缘无故地做额外的工作.在这种情况下输入额外的几个字符...这就是你毕竟受雇的原因. (2认同)