Подтвердить что ты не робот

Почему я не могу использовать псевдоним в столбце count (*) "и ссылаться на него в условии наличия?

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

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

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

4b9b3361

Ответ 1

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

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

  • Сначала создается продукт всех таблиц в из.
  • Предложение where оценивается для исключения строк, которые не удовлетворяют условие search_condition.
  • Затем строки группируются с использованием столбцов в группе.
  • Затем группы, которые не удовлетворяют условию search_condition в , имеющем предложение.
  • Далее, выражения в списке целей selectоценены.
  • Если ключевое слово отличное присутствует в предложении select, повторяющиеся строки теперь устранены.
  • union выполняется после оценки каждого подвыборки.
  • Наконец, результирующие строки сортируются по столбцам указанный в порядке.

Ответ 2

Предложение 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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

select Store_id as Asdf
from StoreProduct
where Asdf = 42

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

Ответ 6

В 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

Я не понимаю цели вашего запроса. Учитывая контекст отправленного вами запроса, ваше условие не обязательно, потому что элементы, которые не существуют, т.е. е. count 0, никогда не будет результатом запроса...

Ответ 7

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

select * from (
  SELECT Store_id as StoreId, Count(*) as StoreCount 
  FROM StoreProduct
  group by Store_id
  ) data
where data.StoreCount > 0

Ответ 8

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

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

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