2010-01-15 18 views

回答

75

document referenced通過CodeByMoonlightansweryour recent question

HAVING子句在SELECT之前計算 - 因此服務器還不知道該別名。

  1. 首先子句中的所有表的產物形成。
  2. 其中子句然後評估以消除不滿足search_condition的 行。
  3. 接下來,使用組中的列按子句對各行進行分組。
  4. 然後,刪除不滿足中具有 子句的search_condition的組。
  5. 接下來,在選擇子句目標列表中的表達式是 評估。
  6. 如果截然不同關鍵字存在於select子句中,現在刪除重複行 。
  7. union是在評估每個子選擇之後取得的。
  8. 最後,生成的行根據order子句中指定的列 進行排序。
+5

我想補充一點,評價的順序是一個邏輯概念在SQL中。實際上,查詢優化器可以選擇不同的操作順序,只要結果與遵循邏輯順序的結果相同即可。 – 2010-01-15 00:55:15

+1

基本上,select子句中定義的別名有兩個用途:1)命名列2)排序 – 2010-01-15 01:03:46

+2

http://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases語句執行順序/不是真正的問題,但他有一個sql執行順序的好列表。當然,有一個更正式的名單。 1. FROM 2. ON 3. OUTER 4. WHERE 5. GROUP BY 6. CUBE | ROLLUP 7. HAVING 8. SELECT 9. DISTINCT 10 ORDER BY 11. TOP – JKG 2010-01-15 01:27:43

2

您可以使用別名計數SELECT子句中,你就不能在其聲明中使用它,所以這將工作

select Store_id as StoreId, count(*) as _count 
    from StoreProduct 
    group by Store_id 
     having count(*) > 0 
-1

可能因爲這是sql定義名稱空間的方式。拿,例如:

select a as b, b as a 
    from table 
    where b = '5' 
order by a 

a和b指的是什麼?設計者只是選擇讓別名只出現在查詢的「外部」。

+0

別名在'order by'子句中可用。在你的例子中,結果將按'a'替換的'table.b'進行排序。嘗試'選擇1作爲一個訂單a'。這將是有效的。這是由於評估的邏輯順序,'order by'在選擇之後出現並可以看到別名。 – 2016-07-13 06:22:39

0

您可以在SQL中使用聚合的別名,但這只是在結果標題中顯示別名。但是,如果您希望在聚合函數中有一個條件,那麼您仍然需要使用聚合,因爲它會評估函數而不是名稱。

9

select子句是邏輯上要執行的最後一個子句,除了order byhaving子句發生在select之前,所以別名還不可用。

如果你真的想使用別名,而不是我建議這樣做,直列視圖可用於使別名可用:

select StoreId, _count 
from (select Store_id as StoreId, count(*) as _count 
    from StoreProduct 
    group by Store_id) T 
where _count > 0 

或SQL Server 2005和以上,熱膨脹係數:

; with T as (select Store_id as StoreId, count(*) as _count 
    from StoreProduct 
    group by Store_id) 
select StoreId, _count 
from T 
where _count > 0 
0

字段名稱的別名是唯一在結果命名列,他們永遠無法查詢內部使用。你不能做這樣的兩種:

select Store_id as Asdf 
from StoreProduct 
where Asdf = 42 

不過,你可以放心地使用count(*)在這兩個地方,數據庫會認識到,這是相同的值,這樣就不會被計算兩次。

0

在Hive 0.11.0和更高版本中,如果hive.groupby.orderby.position.alias設置爲true,則可以按位置指定列。

set hive.groupby.orderby.position.alias=true; 
select Store_id as StoreId, count(*) as _count 
from StoreProduct 
group by 1 

我不明白你的查詢的目的。 鑑於您發佈的查詢的上下文,您的條件並非必要,因爲不存在的項目,即數0,將永遠不會從查詢結果...

0

這裏是我的貢獻(根據張貼在這裏的代碼):

select * from (
    SELECT Store_id as StoreId, Count(*) as StoreCount 
    FROM StoreProduct 
    group by Store_id 
) data 
where data.StoreCount > 0 
相關問題