67

count(*)でエイリアスを使用して、have句で参照できないのはなぜだろうと思っていました。例えば:

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

動作しません。しかし、_countを削除し、代わりにcount(*)を使用すると動作します。

4

8 に答える 8

104

最近の質問への回答で、 CodeByMoonlightによって参照されているドキュメントを参照してください。

HAVING句はSELECTの前に評価されるため、サーバーはそのエイリアスをまだ認識していません。

  1. 最初に、 from句のすべてのテーブルの積が形成されます。
  2. 次に、where句が評価され、search_conditionを満たさない行が削除されます。
  3. 次に、 groupby句の列を使用して行がグループ化されます。
  4. 次に、have句のsearch_conditionを満たさないグループが削除されます。
  5. 次に、select句のターゲットリスト内の式が評価されます。
  6. select句にdistinctキーワードが存在する場合、重複する行が削除されるようになりました。
  7. 結合は、各副選択が評価された後に取得されます。
  8. 最後に、結果の行は、 orderby句で指定された列に従ってソートされます。
于 2010-01-15T00:51:27.067 に答える
14

この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
于 2010-01-15T00:52:12.107 に答える
4

select句でcountにエイリアスを使用できますが、haveステートメントでは使用できないため、これは機能します

select Store_id as StoreId, count(*) as _count
    from StoreProduct
    group by Store_id
        having count(*) > 0
于 2010-01-15T00:50:54.180 に答える
2

フィールド名のエイリアスは、結果の列に名前を付けるためだけのものであり、クエリ内で使用することはできません。あなたもこのようにすることはできません:

select Store_id as Asdf
from StoreProduct
where Asdf = 42

ただし、両方の場所で安全に使用できcount(*)、データベースはそれが同じ値であることを認識するため、2回計算されることはありません。

于 2010-01-15T00:55:26.910 に答える
1

これが私の貢献です(ここに投稿されたコードに基づいています):

select * from (
  SELECT Store_id as StoreId, Count(*) as StoreCount 
  FROM StoreProduct
  group by Store_id
  ) data
where data.StoreCount > 0
于 2017-05-17T00:20:59.097 に答える
0

SQLで集計にエイリアスを使用できますが、これは結果ヘッダーにエイリアスを表示するためだけのものです。ただし、集計関数を使用して条件を設定する場合は、名前ではなく関数を評価するため、集計を使用する必要があります。

于 2010-01-15T00:52:08.000 に答える
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はクエリの結果になることはないため、条件は必要ありません。

于 2016-07-28T10:09:17.640 に答える
-1

おそらくそれがSQLが名前空間を定義する方法だからです。たとえば、次のようにします。

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

aとbは何を指しますか?設計者は、エイリアスをクエリの「外部」にのみ表示することを選択しました。

于 2010-01-15T00:51:29.623 に答える