2014-10-30 23 views
0

我試圖在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的順序執行。在SELECT子句中生成的顯式別名不可用於WHERE子句中。如果我在這裏錯了,請糾正我。

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

+0

Teradata允許您在where子句中使用別名,以及group by和order by子句。 – Andrew 2014-10-30 16:49:49

回答

1

你是正確的,邏輯上的任何選擇通過以下順序處理:

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

除了專有QUALIFY /樣品每一個DBMS會做的完全一樣的。

當您向WHERE條件添加過濾器時,列列表尚未創建,因此使用別名應該會失敗(並且在幾乎所有其他DBMS中都會失敗,只有Access允許使用它類似於Teradata)。

這並不是失敗,因爲Teradata比標準SQL早,這似乎是Teradata首先實施的查詢語言的遺留問題。

但它是一個很好的擴展(爲了避免混淆優化器和/或最終用戶,永遠不會使用現有列名稱的別名),並且您已經習慣了它,它可以避免大量剪切或Derived Tables。