count (*) "column"에 별칭을 사용하고 having 절에서 참조 할 수없는 이유는 무엇입니까?
count (*)에서 별칭을 사용하고 having 절에서 참조 할 수없는 이유가 궁금합니다. 예를 들면 :
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having _count > 0
작동하지 않습니다.하지만 _count를 제거하고 대신 count (*)를 사용하면 작동합니다.
참고 항목 참조 문서 에 의해 CodeByMoonlight 에 대한 답변 에 최근 질문 .
HAVING 절은 SELECT 전에 평가되므로 서버는 해당 별칭에 대해 아직 알지 못합니다.
- 먼저 from 절 에있는 모든 테이블의 곱이 형성됩니다.
- 곳의 절은 다음하는 search_condition을 만족하지 않는 행을 제거하기 위해 평가된다.
- 다음으로 행은 group by 절의 열을 사용하여 그룹화됩니다 .
- 그러면 having 절의 search_condition을 만족하지 않는 그룹 은 제거됩니다.
- 다음으로 select 절 대상 목록 의 표현식 이 평가됩니다.
- select 절에 고유 한 키워드가있는 경우 중복 행이 제거됩니다.
- 노동 조합은 각 후 촬영 서브 선택 평가된다.
- 마지막으로 결과 행은 order by 절에 지정된 열에 따라 정렬됩니다 .
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
select 절에서 count에 별칭을 사용할 수 있습니다. having 문에서는 사용할 수 없으므로 작동합니다.
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having count(*) > 0
필드 이름에 대한 별칭은 결과의 열 이름을 지정하기위한 것이며 쿼리 내에서 사용할 수 없습니다. 다음 중 하나를 수행 할 수 없습니다.
select Store_id as Asdf
from StoreProduct
where Asdf = 42
그러나 count(*)
두 곳 모두에서 안전하게 사용할 수 있으며 데이터베이스는 동일한 값임을 인식하므로 두 번 계산되지 않습니다.
SQL에서 집계에 대한 별칭을 사용할 수 있지만 결과 헤더에 별칭을 표시하기위한 것입니다. 그러나 집계 함수가있는 조건을 갖고 싶다면 이름이 아닌 함수를 평가하기 때문에 집계를 사용해야합니다.
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
질문의 목적을 이해하지 못합니다. 게시 한 쿼리의 컨텍스트를 고려할 때 존재하지 않는 항목 (예 : 개수 0)은 쿼리의 결과가 아니므로 조건이 필요하지 않습니다.
여기에 게시 된 코드를 기반으로 한 내 기여가 있습니다.
select * from (
SELECT Store_id as StoreId, Count(*) as StoreCount
FROM StoreProduct
group by Store_id
) data
where data.StoreCount > 0
아마도 그것이 SQL이 네임 스페이스를 정의하는 방식이기 때문일 것입니다. 예를 들어 :
select a as b, b as a
from table
where b = '5'
order by a
what do a and b refer to? The designers just chose to make the aliases only appear on the "outside" of the query.
ReferenceURL : https://stackoverflow.com/questions/2068682/why-cant-i-use-alias-in-a-count-column-and-reference-it-in-a-having-clause
'Programing' 카테고리의 다른 글
MongoDB의 기본 데이터베이스 경로는 무엇입니까? (0) | 2020.12.24 |
---|---|
_.debounce는 무엇을합니까? (0) | 2020.12.24 |
Protobuf-net을 사용하면서 갑자기 알 수없는 와이어 유형에 대한 예외가 발생했습니다. (0) | 2020.12.24 |
목록에있는 모든 요소의 두 번째 하위 요소를 가져 오는 방법 (0) | 2020.12.24 |
Retry-after HTTP 응답 헤더-영향을 미칩니 까? (0) | 2020.12.24 |