如何在Teradata上运行查询?

时间:2014-10-30 16:42:57

标签: sql hive teradata

我试图在teradata上运行以下查询,并按预期结果:

select column1 as c1Alias from my_table where column2 in ( c1Alias , 10 , 20 , 30) ;

但是我尝试在HIVE上运行相同的查询,它会抛出异常,如下所示:

FAILED: SemanticException [Error 10004]: Line 1:44 Invalid table alias or column  reference 'c1Alias': (possible column names are: .......)

我并不感到惊讶为什么它在HIVE上失败了,但对Teradata的工作方式感到惊讶。

根据我的理解,条款按顺序执行,如WHERE>>选择。显然,在SELECT子句中生成的别名将无法在WHERE子句中使用。如果我在这里错了,请纠正我。

我真的想知道它在teradata中是如何工作的?

2 个答案:

答案 0 :(得分:1)

您是正确的,逻辑上任何SELECT都按以下顺序处理:

  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • OLAP功能
  • QUALIFY
  • 创建SELECT列列表
  • 样品
  • ORDER BY

除了专有的QUALIFY / SAMPLE,每个DBMS都会完全相同。

当您向WHERE条件添加过滤器时,尚未创建列列表,因此使用别名应该失败(并且几乎在所有其他DBMS中都会失败,只有Access允许使用它类似于Teradata)。

它没有失败,因为Teradata比标准SQL旧,这似乎是Teradata首先实现的查询语言的遗留。

但它是一个很好的扩展(永远不会是现有列名的别名,以避免混淆优化器和/或最终用户)并且你很快习惯它,它避免了大量剪切和粘贴或派生表。

答案 1 :(得分:0)

SQL 的执行顺序在这里解释得很好: https://www.eversql.com/sql-order-of-operations-sql-query-order-of-execution/

文章摘录供您快速参考:(感谢作者涵盖 SQL 的所有 10 个部分)

  1. FROM,包括 JOIN
  2. 哪里
  3. 分组依据
  4. 拥有
  5. WINDOW 函数
  6. 选择
  7. 与众不同
  8. 联合
  9. 订购者

10.LIMIT 和 OFFSET