Почему я не могу использовать псевдоним в столбце count (*) "и ссылаться на него в условии наличия?
Мне было интересно, почему я не могу использовать псевдоним в count (*) и ссылаться на него в предложении having. Например:
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having _count > 0
Не работает. Но он работает, если я удалю _count и использую count (*).
Ответы
Ответ 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? Дизайнеры просто решили, чтобы псевдонимы отображались только "снаружи" запроса.