source

카운트(*) "열"에서 별칭을 사용하고 have 절에서 참조할 수 없는 이유는 무엇입니까?

itover 2023. 6. 26. 22:28
반응형

카운트(*) "열"에서 별칭을 사용하고 have 절에서 참조할 수 없는 이유는 무엇입니까?

왜 제가 카운트(*)에서 별칭을 사용할 수 없고 have 절에서 참조할 수 없는지 궁금합니다.예를 들어:

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. 그런 다음 where 절을 평가하여 search_condition을 만족하지 않는 행을 제거합니다.
  3. 그런 다음 절별로 그룹화된 열을 사용하여 행을 그룹화합니다.
  4. 그런 다음 have 절의 search_condition을 만족하지 않는 그룹은 제거됩니다.
  5. 그런 다음 절 선택 대상 목록의 식을 평가합니다.
  6. select 절에 고유 키워드가 있으면 중복 행이 제거됩니다.
  7. 하위 선택 항목을 평가한 후 결합이 이루어집니다.
  8. 마지막으로, 결과 행은 절별 순서에 지정된 열에 따라 정렬됩니다.

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

반응형