Programing

count (*) "column"에 별칭을 사용하고 having 절에서 참조 할 수없는 이유는 무엇입니까?

lottogame 2020. 12. 24. 23:17
반응형

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 전에 평가되므로 서버는 해당 별칭에 대해 아직 알지 못합니다.

  1. 먼저 from에있는 모든 테이블의 곱이 형성됩니다.
  2. 곳의 절은 다음하는 search_condition을 만족하지 않는 행을 제거하기 위해 평가된다.
  3. 다음으로 행은 group by 절의 열을 사용하여 그룹화됩니다 .
  4. 그러면 having 절의 search_condition을 만족하지 않는 그룹 은 제거됩니다.
  5. 다음으로 select 절 대상 목록 의 표현식 이 평가됩니다.
  6. select 절에 고유 한 키워드가있는 경우 중복 행이 제거됩니다.
  7. 노동 조합은 각 후 촬영 서브 선택 평가된다.
  8. 마지막으로 결과 행은 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

반응형