2011年12月12日 星期一

Alias (別名) 不能在 WHERE 裡使用? 因為 SQL 子句執行順序

情境

執行T-SQL:
SELECT id, (price * 0.79) AS SpecialPrice 
FROM Books 
WHERE SpecialPrice > 300

會得到這樣的的錯誤訊息:無效的資料行名稱 'SpecialPrice'。

WHY

以下是MSDN上的解釋:

SELECT 陳述式的邏輯處理順序

下列步驟顯示 SELECT 陳述式的邏輯處理順序或繫結順序。這個順序決定何時將某一個步驟中定義的物件提供給後續步驟的子句使用。例如,如果查詢處理器可以繫結至 (存取) FROM 子句中定義的資料表或檢視表,則這些物件及其資料行就可供所有後續步驟使用。 反之,由於 SELECT 子句是步驟 8,因此之前的子句無法參考該子句中定義的任何資料行別名或衍生資料行。不過,後續子句 (例如 ORDER BY 子句) 可以參考這些資料行別名或衍生資料行。請注意,實際執行的陳述式是由查詢處理序所決定,因此順序可能與此清單有所不同。 
  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE 或 WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. TOP

簡單一句話

WHERE的執行順序比SELECT優先,自然也就不認得SELECT裡的Alias了。
參考資料:
[MSDN Forum]Order of Execution 可以參考回答提供的連結
至於MySQL可以參考:Can you use an alias in the WHERE clause in mysql?


回目錄
回首頁

沒有留言 :

張貼留言

Related Posts Plugin for WordPress, Blogger...