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. 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.
- najpierw tworzy się iloczyn wszystkich tabel w z klauzuli.
- klauzula gdzie jest następnie oceniana w celu wyeliminowania wierszy, które nie spełniają search_condition.
- dalej wiersze są pogrupowane za pomocą kolumn w klauzuli group by.
- następnie grupy, które nie spełniają search_condition w mające klauzula {[16] } jest eliminowana.
- następnie wyrażenia z listy docelowej klauzuli select są / align = "left" /
- Jeśli distinct słowo kluczowe present w klauzuli select, Duplikuj wiersze zostały wyeliminowane.
- Unia jest pobierana po ocenie każdego podwyzszenia.
- na koniec, wynikowe wiersze są sortowane według kolumn określone w klauzuli order by.
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
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
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.
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ę.
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...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
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.
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