簡體   English   中英

Teradata 的查詢是如何工作的?

[英]How is query working at 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 中是如何工作的?

你是對的,從邏輯上講,任何 SELECT 都按以下順序處理:

  • 在哪里
  • 通過...分組
  • OLAP 函數
  • 合格
  • 創建 SELECT 列列表
  • 樣本
  • 訂購者

除了專有的 QUALIFY/SAMPLE 之外,每個 DBMS 都會做同樣的事情。

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

它沒有失敗,因為 Teradata 比標准 SQL 更舊,這似乎是 Teradata 首先實現的查詢語言的遺物。

但它是一個很好的擴展(只是從不為現有列名設置別名以避免混淆優化器和/或最終用戶)並且您很快就會習慣它,它避免了大量剪切和粘貼或派生表。

SQL 的執行順序在這里解釋得很好: https : //www.eversql.com/sql-order-of-operations-sql-query-order-of-execution/

這篇文章的摘錄供您快速參考:(感謝作者涵蓋 SQL 的所有 10 個部分)

  1. FROM,包括 JOIN
  2. 在哪里
  3. 通過...分組
  4. 窗口功能
  5. 選擇
  6. 清楚的
  7. 聯盟
  8. 訂購者

10.LIMIT和OFFSET

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM