카운트(*) "열"에서 별칭을 사용하고 have 절에서 참조할 수 없는 이유는 무엇입니까?
왜 제가 카운트(*)에서 별칭을 사용할 수 없고 have 절에서 참조할 수 없는지 궁금합니다.예를 들어:
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by Store_id
having _count > 0
안 될 것 같아요.하지만 _count를 제거하고 count(*)를 대신 사용하면 작동합니다.
최근 질문에 대한 답변에서 CodeByMoonlight에서 참조한 문서를 참조하십시오.
HAVING 절은 SELECT 이전에 평가되므로 서버는 아직 해당 별칭을 알지 못합니다.
- 먼저 from 절의 모든 테이블의 곱이 형성됩니다.
- 그런 다음 where 절을 평가하여 search_condition을 만족하지 않는 행을 제거합니다.
- 그런 다음 절별로 그룹화된 열을 사용하여 행을 그룹화합니다.
- 그런 다음 have 절의 search_condition을 만족하지 않는 그룹은 제거됩니다.
- 그런 다음 절 선택 대상 목록의 식을 평가합니다.
- select 절에 고유 키워드가 있으면 중복 행이 제거됩니다.
- 각 하위 선택 항목을 평가한 후 결합이 이루어집니다.
- 마지막으로, 결과 행은 절별 순서에 지정된 열에 따라 정렬됩니다.
그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 절에서 카운트에 대한 별칭을 사용할 수 있습니다. have 문에서는 사용할 수 없으므로 이것이 작동합니다.
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(*)두 장소 모두에서 동일한 값임을 데이터베이스가 인식하므로 두 번 계산되지 않습니다.
다음은 저의 기여입니다(여기에 게시된 코드를 기반으로 함).
select * from (
SELECT Store_id as StoreId, Count(*) as StoreCount
FROM StoreProduct
group by Store_id
) data
where data.StoreCount > 0
SQL에서 집계에 대한 별칭을 사용할 수 있지만 이는 결과 헤더에 별칭을 표시하기 위한 것입니다.그러나 에 집계 함수가 포함된 조건이 있는 경우에는 이름이 아닌 함수를 평가하므로 집계를 사용해야 합니다.
Hive 0.11.0 이상에서는 hive.groupby.orderby.position인 경우 위치별로 열을 지정할 수 있습니다.별칭이 true로 설정되었습니다.
set hive.groupby.orderby.position.alias=true;
select Store_id as StoreId, count(*) as _count
from StoreProduct
group by 1
저는 당신의 질문의 목적을 이해할 수 없습니다.게시한 쿼리의 컨텍스트를 고려할 때 존재하지 않는 항목(예: 카운트 0)은 쿼리의 결과가 되지 않으므로 조건이 필요하지 않습니다.
sql이 네임스페이스를 정의하는 방식이기 때문일 것입니다. 예를 들어 다음과 같습니다.
select a as b, b as a
from table
where b = '5'
order by a
a와 b는 무엇을 의미합니까?디자이너들은 별칭을 쿼리의 "외부"에만 표시하도록 선택했습니다.
언급URL : https://stackoverflow.com/questions/2068682/why-cant-i-use-alias-in-a-count-column-and-reference-it-in-a-having-clause
'source' 카테고리의 다른 글
| API 'variant.getExternalNativeBuildTasks()'가 더 이상 사용되지 않으며 'variant.getExternalNativeBuildProviders()'로 대체되었습니다. (0) | 2023.06.26 |
|---|---|
| Angular 2 XMLHttpRequest에서 열기를 실행하지 못했습니다.잘못된 URL (0) | 2023.06.26 |
| Ruby on Rails에서 Gemfile과 Gemfile.lock의 차이점은 무엇입니까? (0) | 2023.06.26 |
| Azure VM의 성능이 매우 느림 (0) | 2023.06.06 |
| 1분마다 저장하고 최신 24시간 데이터만 데이터베이스에서 선택하는 모범 사례? (0) | 2023.06.06 |