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

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

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

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

57
задан André Pena 15 January 2010 в 00:52
поделиться

6 ответов

См. Документ , ссылающийся на документ CodeBymoonlight в ответе на Ваш последний вопрос .

Пункт на имении оценивается до выбора - поэтому сервер пока не знает об этом псевдониме.

  1. Сначала образуется продукт всех таблиц в из пункта .
  2. , где предложение затем оценивается для устранения строк, которые не удовлетворяют search_condition.
  3. Далее, строки сгруппированы с использованием столбцов в группе с предложением .
  4. Тогда группы, которые не удовлетворяют поиску в , имеющих пункт устраняется.
  5. Далее, выражения в разделе SELECT оценивается.
  6. Если различные ключевое слово в настоящее время в пункте выбора, дублирующиеся строки сейчас устранены.
  7. Союз принимается после оценки каждого подсчета.
  8. Наконец, полученные строки сортируются в соответствии с столбцами указано в пункте по пункте .
94
ответ дан 24 November 2019 в 19:32
поделиться

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

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

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
ответ дан 24 November 2019 в 19:32
поделиться

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

select Store_id as Asdf
from StoreProduct
where Asdf = 42

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

1
ответ дан 24 November 2019 в 19:32
поделиться

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

0
ответ дан 24 November 2019 в 19:32
поделиться

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

select Store_id as StoreId, count(*) as _count
    from StoreProduct
    group by Store_id
        having count(*) > 0
4
ответ дан 24 November 2019 в 19:32
поделиться

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

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

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

-1
ответ дан 24 November 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: