在创建涉及子查询的视图时,MySQL别名被列名替换

时间:2015-06-13 13:05:50

标签: mysql mysql-workbench

当我从脚本创建视图时,为什么列别名被原始列名替换?该脚本有效,视图失败。

脚本使用外部查询/内部查询a.k.a. query / subquery选择记录。子查询用于SELECT子句。每个子查询本身都是一个SELECT子句,它成为结果集中的一列。见http://www.techonthenet.com/mysql/subqueries.php

子查询的SELECT子句中使用的别名将替换为其原始列名。用于为子查询指定简短名称的别名不会被替换。

这是一个元版本,因此您可以看到结构。

(
 select avg(t1.column) 
 from t1 
 where ***`t1.`Date` = `t1.`Date`***
) as `Short column name`,

在View版本中,替换了别名后,子查询变为;

When

这样做的结果是平均值是在所有日期计算的,而不是仅在外部查询中指定为group by `Date` order by `Date` 的日期。

另一个脚本以相同的方式构建,转换为视图而没有问题。别名保留。

在糟糕和良好的观点中使用的条款之间存在差异,但对我而言,它应该导致问题并不明显。

糟糕的观点以;

结束
group by

而好的只有regex子句结束。

另一个区别是在坏视图中别名的列可能是字段类型DATETIME,而良好视图中的列可能是INT类型之一。 (实际上是周(t1.Date)。

使用:

  • MySQL 5.5
  • MySQL Workbench 6.0.8
  • Ubuntu 14.04

1 个答案:

答案 0 :(得分:0)

SELECT中的别名是指查询块的输出,而不是处理查询块。

执行所需操作的正确方法是使用带有表别名的相关子查询:

select touter.`Date` as **`*When*`**,
        (select avg(tinner.column) 
         from t1 tinner
         where `tinner.`Date` = touter.date
        ) as `Short column name`,
from t1 as touter
group by `Date`
order by `Date`;

我不知道为什么要计算所有日期的平均值。我希望它返回一个错误,或者可能是NULL值。也许你真正的where子句是t1.Date = Date,你希望MySQL能够神奇地知道第二个Date引用的内容。不要依赖魔法。使用表别名并明确。