【问题标题】:How is query working at Teradata?Teradata 的查询如何工作?
【发布时间】:2014-12-26 19:53:14
【问题描述】:

我尝试在 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 的顺序执行。显然,在 SELECT 子句中生成的别名不能在 WHERE 子句中使用。如果我在这里错了,请纠正我。

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

【问题讨论】:

  • Teradata 允许您在 where 子句中使用别名,以及 group by 和 order by 子句。

标签: sql hive teradata


【解决方案1】:

你是对的,逻辑上任何 SELECT 都按以下顺序处理:

  • 来自
  • 在哪里
  • 分组依据
  • OLAP 函数
  • 合格
  • 创建 SELECT 列列表
  • 示例
  • 订购人

除了专有的 QUALIFY/SAMPLE 之外,每个 DBMS 都会做同样的事情。

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

这并没有失败,因为 Teradata 比标准 SQL 更早,而且这似乎是 Teradata 首先实现的查询语言的残余。

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

【讨论】:

    【解决方案2】:

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

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

    1. FROM,包括联接
    2. 在哪里
    3. 分组依据
    4. 窗口函数
    5. 选择
    6. 不同
    7. 联合
    8. 订购人

    10.LIMIT 和 OFFSET

    【讨论】:

      猜你喜欢
      • 2018-02-07
      • 1970-01-01
      • 2020-03-08
      • 2020-08-30
      • 1970-01-01
      • 2022-01-27
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多