我想知道爲什麼我不能在count(*)中使用別名,並在having子句中引用它。例如:爲什麼我不能在計數(*)「列」中使用別名並在having子句中引用它?
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having _count > 0
不會工作..但它工作,如果我刪除_count並使用count(*)來代替。
我想知道爲什麼我不能在count(*)中使用別名,並在having子句中引用它。例如:爲什麼我不能在計數(*)「列」中使用別名並在having子句中引用它?
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having _count > 0
不會工作..但它工作,如果我刪除_count並使用count(*)來代替。
見document referenced通過CodeByMoonlight在answer至your recent question。
HAVING子句在SELECT之前計算 - 因此服務器還不知道該別名。
- 首先從子句中的所有表的產物形成。
- 其中子句然後評估以消除不滿足search_condition的 行。
- 接下來,使用組中的列按子句對各行進行分組。
- 然後,刪除不滿足中具有 子句的search_condition的組。
- 接下來,在選擇子句目標列表中的表達式是 評估。
- 如果截然不同關鍵字存在於select子句中,現在刪除重複行 。
- union是在評估每個子選擇之後取得的。
- 最後,生成的行根據order子句中指定的列 進行排序。
您可以使用別名計數SELECT子句中,你就不能在其聲明中使用它,所以這將工作
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having count(*) > 0
可能因爲這是sql定義名稱空間的方式。拿,例如:
select a as b, b as a
from table
where b = '5'
order by a
a和b指的是什麼?設計者只是選擇讓別名只出現在查詢的「外部」。
別名在'order by'子句中可用。在你的例子中,結果將按'a'替換的'table.b'進行排序。嘗試'選擇1作爲一個訂單a'。這將是有效的。這是由於評估的邏輯順序,'order by'在選擇之後出現並可以看到別名。 – 2016-07-13 06:22:39
您可以在SQL中使用聚合的別名,但這只是在結果標題中顯示別名。但是,如果您希望在聚合函數中有一個條件,那麼您仍然需要使用聚合,因爲它會評估函數而不是名稱。
select
子句是邏輯上要執行的最後一個子句,除了order by
。 having
子句發生在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
字段名稱的別名是唯一在結果命名列,他們永遠無法查詢內部使用。你不能做這樣的兩種:
select Store_id as Asdf
from StoreProduct
where Asdf = 42
不過,你可以放心地使用count(*)
在這兩個地方,數據庫會認識到,這是相同的值,這樣就不會被計算兩次。
在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,將永遠不會從查詢結果...
這裏是我的貢獻(根據張貼在這裏的代碼):
select * from (
SELECT Store_id as StoreId, Count(*) as StoreCount
FROM StoreProduct
group by Store_id
) data
where data.StoreCount > 0
我想補充一點,評價的順序是一個邏輯概念在SQL中。實際上,查詢優化器可以選擇不同的操作順序,只要結果與遵循邏輯順序的結果相同即可。 – 2010-01-15 00:55:15
基本上,select子句中定義的別名有兩個用途:1)命名列2)排序 – 2010-01-15 01:03:46
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