Dlaczego nie mogę użyć aliasu w "kolumnie" count (*) i odwołać się do niego w klauzuli having?

Zastanawiałem się, dlaczego nie mogę użyć aliasu w count(*) i odwołać się do niego w klauzuli having. Na przykład:

select Store_id as StoreId, count(*) as _count
    from StoreProduct
    group by Store_id
        having _count > 0
Nie zadziałałoby.. Ale to działa, jeśli usunę _count i użyję count(*) zamiast tego.
Author: André Pena, 2010-01-15

8 answers

Zobacz Dokument odwołujący się przez CodeByMoonlight w odpowiedzi na twoje ostatnie pytanie .

Klauzula HAVING jest oceniana przed select - więc serwer nie wie jeszcze o tym aliasie.

  1. najpierw tworzy się iloczyn wszystkich tabel w z klauzuli.
  2. klauzula gdzie jest następnie oceniana w celu wyeliminowania wierszy, które nie spełniają search_condition.
  3. dalej wiersze są pogrupowane za pomocą kolumn w klauzuli group by.
  4. następnie grupy, które nie spełniają search_condition w mające klauzula {[16] } jest eliminowana.
  5. następnie wyrażenia z listy docelowej klauzuli select są / align = "left" /
  6. Jeśli distinct słowo kluczowe present w klauzuli select, Duplikuj wiersze zostały wyeliminowane.
  7. Unia jest pobierana po ocenie każdego podwyzszenia.
  8. na koniec, wynikowe wiersze są sortowane według kolumn określone w klauzuli order by.
 100
Author: martin clayton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:39

Klauzula select jest ostatnią klauzulą wykonywaną logicznie, z wyjątkiem order by. Klauzula having występuje przed select, więc aliasy nie są jeszcze dostępne.

Jeśli naprawdę chcesz użyć aliasu, nie żebym tego zalecał, można użyć widoku in-line, Aby udostępnić aliasy:

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

Lub w SQL Server 2005 i nowszych, 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
 13
Author: Shannon Severance,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-15 00:52:12

Możesz użyć aliasu dla count w klauzuli select, po prostu nie możesz go użyć w instrukcji having, więc to zadziała

select Store_id as StoreId, count(*) as _count
    from StoreProduct
    group by Store_id
        having count(*) > 0
 4
Author: Glenn Slaven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-15 00:50:54

Aliasy nazw pól służą tylko do nazywania kolumn w wyniku, nigdy nie mogą być używane wewnątrz zapytania. Tak też się nie da:

select Store_id as Asdf
from StoreProduct
where Asdf = 42

Można jednak bezpiecznie używać count(*) w obu miejscach, a baza danych rozpozna, że jest to ta sama wartość, więc nie zostanie obliczona dwa razy.

 2
Author: Guffa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-15 00:55:26

Możesz użyć aliasu dla agregatów w SQL, ale to tylko po to, aby pokazać alias w nagłówkach wyników. Ale jeśli chcesz mieć warunek z agregatem funkcji w having nadal trzeba użyć agregatu, ponieważ ocenia funkcję, a nie nazwę.

 0
Author: Jose Chama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-15 00:52:08

W Hive 0.11.0 i nowszych kolumnach można określić według pozycji, jeśli hive.groupby.orderbypozycji.alias jest ustawiony na true.

set hive.groupby.orderby.position.alias=true;
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by 1
Nie rozumiem celu Twojego zapytania. Biorąc pod uwagę kontekst wysłanego zapytania, Twój warunek nie jest konieczny, ponieważ elementy, które nie istnieją, tj. count 0, nigdy nie będą wynikiem zapytania...
 0
Author: rafaelvalle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-28 10:09:17

Oto mój wkład (na podstawie zamieszczonego tutaj kodu):

select * from (
  SELECT Store_id as StoreId, Count(*) as StoreCount 
  FROM StoreProduct
  group by Store_id
  ) data
where data.StoreCount > 0
 0
Author: New Dawg Learning Old Tricks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 00:38:22

Prawdopodobnie dlatego, że w ten sposób SQL definiuje przestrzenie nazw. Weźmy na przykład:

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

Do czego odnoszą się a i b? Projektanci po prostu zdecydowali się, aby aliasy pojawiały się tylko na" zewnątrz " zapytania.

 -1
Author: Jimmy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-15 00:51:29