web-dev-qa-db-ja.com

count(*) "column"でエイリアスを使用し、having句でそれを参照できないのはなぜですか?

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

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

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

57
André Pena

ドキュメント参照 by CodeByMoonlightanswer to 最近の質問 を参照してください。

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

  1. 最初に、from句のすべてのテーブルの積が形成されます。
  2. 次に、where句が評価され、search_conditionを満たさない行が削除されます。
  3. 次に、group by句の列を使用して行がグループ化されます。
  4. 次に、having句のsearch_conditionを満たさないグループが削除されます。
  5. 次に、select句のターゲットリスト内の式が評価されます。
  6. Select句にdistinctキーワードが存在する場合、重複する行は削除されます。
  7. unionは、各副選択が評価された後に取得されます。
  8. 最後に、結果の行は、order by句で指定された列に従ってソートされます。
92
martin clayton

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
12

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

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

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

_select Store_id as Asdf
from StoreProduct
where Asdf = 42
_

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

1
Guffa

私の貢献は次のとおりです(ここに投稿されたコードに基づく)。

select * from (
  SELECT Store_id as StoreId, Count(*) as StoreCount 
  FROM StoreProduct
  group by Store_id
  ) data
where data.StoreCount > 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

クエリの目的がわかりません。投稿したクエリのコンテキストを考えると、存在しないアイテムがあるため、条件は必要ありません。 e。カウント0、クエリの結果になることはありません...

0
rafaelvalle

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

0
Jose Chama