Почему я не могу использовать псевдоним в столбце count (*) и ссылаться на него в предложении has? - PullRequest
56 голосов
/ 15 января 2010

Мне было интересно, почему я не могу использовать псевдоним в счетчике (*) и ссылаться на него в предложении has. Например:

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

Не будет работать .. Но это работает, если я удалю _count и вместо этого буду использовать count (*).

Ответы [ 8 ]

91 голосов
/ 15 января 2010

См. Документ со ссылкой от CodeByMoonlight в ответе на ваш последний вопрос .

Предложение HAVING оценивается перед SELECT, поэтому сервер еще не знает об этом псевдониме.

  1. Сначала формируется произведение всех таблиц в предложении из .
  2. Предложение , где затем оценивается, чтобы исключить строки, которые не удовлетворяют условие поиска.
  3. Далее строки группируются по столбцам в группе по предложению .
  4. Затем, группы, которые не удовлетворяют условию search_control в , имеют пункт исключен.
  5. Далее, выражения в списке целей предложения select оценены.
  6. Если в предложении select присутствует ключевое слово , отличающееся , дублирующиеся строки теперь устранены.
  7. Объединение берется после оценки каждого подвыбора.
  8. Наконец, результирующие строки сортируются по столбцам указывается в порядке по предложению .
11 голосов
/ 15 января 2010

Предложение select является последним предложением, которое будет выполнено логически, за исключением order by. Предложение having происходит до выбора, поэтому псевдонимы пока недоступны.

Если вы действительно хотите использовать псевдоним, не то, чтобы я рекомендовал это делать, можно использовать встроенное представление, чтобы сделать псевдонимы доступными:

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
4 голосов
/ 15 января 2010

Вы можете использовать псевдоним для количества в предложении select, вы просто не можете использовать его в операторе Имея, так что это будет работать

select Store_id as StoreId, count(*) as _count
    from StoreProduct
    group by Store_id
        having count(*) > 0
1 голос
/ 15 января 2010

Псевдонимы для имен полей предназначены только для именования столбцов в результате, они никогда не могут использоваться внутри запроса. Вы также не можете делать это так:

select Store_id as Asdf
from StoreProduct
where Asdf = 42

Однако вы можете безопасно использовать count(*) в обоих местах, и база данных обнаружит, что это одно и то же значение, поэтому оно не будет рассчитываться дважды.

0 голосов
/ 17 мая 2017

Вот мой вклад (на основе кода, размещенного здесь):

select * from (
  SELECT Store_id as StoreId, Count(*) as StoreCount 
  FROM StoreProduct
  group by Store_id
  ) data
where data.StoreCount > 0
0 голосов
/ 28 июля 2016

В 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 голосов
/ 15 января 2010

Вы можете использовать псевдоним для агрегатов в SQL, но это просто для отображения псевдонима в заголовках результатов. Но когда вы хотите иметь условие с агрегатной функцией в том, что вам нужно использовать агрегат, потому что он оценивает функцию, а не имя.

0 голосов
/ 15 января 2010

Вероятно, потому, что именно так sql определяет пространства имен. возьмите, например:

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

к чему относятся a и b? Дизайнеры просто решили сделать так, чтобы псевдонимы появлялись только «снаружи» запроса.

...