我试图在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中是如何工作的?
答案 0 :(得分:1)
您是正确的,逻辑上任何SELECT都按以下顺序处理:
除了专有的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 个部分)
10.LIMIT 和 OFFSET