count(*)でエイリアスを使用して、have句で参照できないのはなぜだろうと思っていました。例えば:
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having _count > 0
動作しません。しかし、_countを削除し、代わりにcount(*)を使用すると動作します。
count(*)でエイリアスを使用して、have句で参照できないのはなぜだろうと思っていました。例えば:
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having _count > 0
動作しません。しかし、_countを削除し、代わりにcount(*)を使用すると動作します。
最近の質問への回答で、 CodeByMoonlightによって参照されているドキュメントを参照してください。
HAVING句はSELECTの前に評価されるため、サーバーはそのエイリアスをまだ認識していません。
- 最初に、 from句のすべてのテーブルの積が形成されます。
- 次に、where句が評価され、search_conditionを満たさない行が削除されます。
- 次に、 groupby句の列を使用して行がグループ化されます。
- 次に、have句のsearch_conditionを満たさないグループが削除されます。
- 次に、select句のターゲットリスト内の式が評価されます。
- select句にdistinctキーワードが存在する場合、重複する行が削除されるようになりました。
- 結合は、各副選択が評価された後に取得されます。
- 最後に、結果の行は、 orderby句で指定された列に従ってソートされます。
この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以降では、CTEは次のようになります。
; 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句でcountにエイリアスを使用できますが、haveステートメントでは使用できないため、これは機能します
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having count(*) > 0
フィールド名のエイリアスは、結果の列に名前を付けるためだけのものであり、クエリ内で使用することはできません。あなたもこのようにすることはできません:
select Store_id as Asdf
from StoreProduct
where Asdf = 42
ただし、両方の場所で安全に使用できcount(*)
、データベースはそれが同じ値であることを認識するため、2回計算されることはありません。
これが私の貢献です(ここに投稿されたコードに基づいています):
select * from (
SELECT Store_id as StoreId, Count(*) as StoreCount
FROM StoreProduct
group by Store_id
) data
where data.StoreCount > 0
SQLで集計にエイリアスを使用できますが、これは結果ヘッダーにエイリアスを表示するためだけのものです。ただし、集計関数を使用して条件を設定する場合は、名前ではなく関数を評価するため、集計を使用する必要があります。
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はクエリの結果になることはないため、条件は必要ありません。
おそらくそれがSQLが名前空間を定義する方法だからです。たとえば、次のようにします。
select a as b, b as a
from table
where b = '5'
order by a
aとbは何を指しますか?設計者は、エイリアスをクエリの「外部」にのみ表示することを選択しました。