Я задавался вопросом, почему я не могу использовать псевдоним в количестве (*) и сослаться на него в пункте наличия. Например:
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having _count > 0
Не работал бы.. Но это работает, если я удаляю _count и использую количество (*) вместо этого.
См. Документ , ссылающийся на документ CodeBymoonlight в ответе на Ваш последний вопрос .
Пункт на имении оценивается до выбора - поэтому сервер пока не знает об этом псевдониме.
- Сначала образуется продукт всех таблиц в из пункта .
- , где предложение затем оценивается для устранения строк, которые не удовлетворяют search_condition.
- Далее, строки сгруппированы с использованием столбцов в группе с предложением .
- Тогда группы, которые не удовлетворяют поиску в , имеющих пункт устраняется.
- Далее, выражения в разделе 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
Псевдонимы для имени поля предназначены только для именования столбцов в результате, они никогда не могут использоваться внутри запроса. Вы также не можете поделать это либо:
select Store_id as Asdf
from StoreProduct
where Asdf = 42
Тем не менее, вы можете безопасно использовать счет (*)
в обоих местах, и база данных узнает, что это то же значение, поэтому он не будет рассчитан дважды.
Вы можете использовать псевдоним для агрегатов в SQL, но это просто для отображения псевдонимов в заголовках результатов. Но когда вы хотите иметь условие с совокупной функцией в том, что вам все еще нужно использовать агрегат, потому что он оценивает функцию, а не имя.
Вы можете использовать псевдоним для количества в пункте выбора, вы просто не можете использовать его в выписке, так что это будет работать
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having count(*) > 0
, вероятно, потому, что это так, как SQL определяет пространства имен. Возьми, например:
select a as b, b as a
from table
where b = '5'
order by a
Что ссылается? Дизайнеры только что решили сделать псевдонимы только на «снаружи» запроса.