2

我想知道 MySQL 是否为您正在构建的当前表提供某种默认别名(如 SmallTalk 中的“self”或 Java 中的“this”)。例如:

SELECT 
SUM(revenue) AS revenue,
SUM(units) AS units,
SUM(revenue)/SUM(units) AS revPerUnit,
-- I want to replace the above line with the below line:
self.revenue/self.units AS revPerUnit2
FROM inputTable;

我知道我可以只使用明确的别名,但我想知道是否有一种方法可以在存在不明确的定义时指定您想要当前表的别名。

4

2 回答 2

3

通常,这就是我在这些情况下所做的:

SELECT revenue, 
       units, 
       revenue / units AS revperunit2 
FROM   (SELECT SUM(revenue) AS revenue, 
               SUM(units)   AS units 
        FROM   inputtable) subsel 

有时您有复杂的查询,并且重新声明字段不利于可读性,也不利于性能。子查询是要走的路。

于 2011-10-05T19:27:55.287 回答
1

由于非常具体的原因,您所描述的在 SQL 中是不可能的。在一个SELECT列表中,所有列都将同时计算(创建、解析),或者就好像它们同时计算(创建、解析)一样。或者换句话说,以任何计算顺序产生相同的结果。

这意味着在另一列的计算中不能使用(引用)列别名。

如果您描述的是可能的,我们可以有以下类型的循环引用:

SELECT SUM(a)*sb AS sa
     , SUM(b)*sa AS sb 
FROM aTable

应该将其视为错误而被拒绝。通过在查询解析器中添加一个级别来检查循环引用(存在循环引用:拒绝查询),这将相当容易

但是这个结果应该如何计算:

SELECT SUM(a) AS b
     , SUM(b) AS a
FROM aTable

或者为什么要拒​​绝它?

如果没有列a并且b在表中,好的,那很容易,(存在循环引用:拒绝查询)。但是如果有列aand b,它是不是循环引用?是bSUM(b)一个模棱两可的参考?它是指列b还是别名b


顺便说一句,第二个是有效的 SQL 查询。因为 SQL 假定所有计算都已完成(SUM(a)SUM(b)此处),然后将别名分配给结果。与以下内容相同:

UPDATE aTable
SET a=b
  , b=a

它实际上交换了两列中的数据。当你这样写的时候,不是很清楚,直到你尝试一下。还有一种更漂亮的替代方法可以更好地了解后台发生的事情(并非所有 RDBMS 都支持这一点):

UPDATE aTable
SET (a,b)=(b,a)
于 2011-10-05T20:36:56.437 回答