source

SQL - 그룹화 기준에서 별칭 사용

lovecheck 2023. 7. 31. 21:29
반응형

SQL - 그룹화 기준에서 별칭 사용

SQL 구문이 궁금합니다.그래서 만약에 제가

SELECT 
 itemName as ItemName,
 substring(itemName, 1,1) as FirstLetter,
 Count(itemName)
FROM table1
GROUP BY itemName, FirstLetter

다음과 같은 이유로 올바르지 않습니다.

GROUP BY itemName, FirstLetter 

정말 그래야 합니다.

GROUP BY itemName, substring(itemName, 1,1)

하지만 왜 우리는 단순히 전자를 편리하게 사용할 수 없을까요?

SQL은 쿼리가 다음 순서로 실행된 것처럼 구현됩니다.

  1. FROM 절
  2. WHERE 절
  3. GROUP BY 절
  4. HAVING절
  5. SELECT 절
  6. 조항별 주문

대부분의 관계형 데이터베이스 시스템의 경우, 이전 단계에서 도입된 이름(열 또는 별칭)이 유효한지 설명합니다.

따라서 Oracle 및 SQL Server에서는 SELECT 절 앞에 GROUP BY가 실행되기 때문에 SELECT 절에 정의한 GROUP BY 절의 용어를 사용할 수 없습니다.

그러나 예외가 있습니다: MySQL과 Postgres는 그것을 허용하는 추가적인 스마트함을 가지고 있는 것 같습니다.

별칭을 사용할 수 있도록 항상 하위 쿼리를 사용할 수 있습니다. 물론 성능을 확인하십시오. (데이터베이스 서버가 모두 동일하게 실행되지만 확인하는 데 전혀 지장이 없습니다.)

SELECT ItemName, FirstLetter, COUNT(ItemName)
FROM (
    SELECT ItemName, SUBSTRING(ItemName, 1, 1) AS FirstLetter
    FROM table1
    ) ItemNames
GROUP BY ItemName, FirstLetter

적어도 Postgre에서는.SQL GROUP BY 절의 결과 집합에 있는 열 번호를 사용할 수 있습니다.

SELECT 
 itemName as ItemName,
 substring(itemName, 1,1) as FirstLetter,
 Count(itemName)
FROM table1
GROUP BY 1, 2

대화식으로 이 작업을 수행하고 쿼리를 편집하여 결과의 열 수나 순서를 변경하는 경우에는 당연히 문제가 되기 시작합니다.그래도.

SQL Server에서는 논리적 처리 순서 때문에 GROUP BY 절의 별칭을 참조할 수 없습니다.GROUP BY 절은 SELECT 절보다 먼저 처리되므로 GROUP BY 절을 평가할 때 별칭을 알 수 없습니다.또한 ORDER BY 절에서 별칭을 사용할 수 있는 이유를 설명합니다.

다음은 SQL Server 논리 처리 단계에 대한 정보를 제공하는 하나의 소스입니다.

그런지는 하기 위해 SQL Server의 제한 사항에 대해 설명하고자 .CROSS APPLY별칭을 만듭니다.그러면 당신은 그것을 사용합니다.GROUP BY다음과 같은 절:

SELECT 
 itemName as ItemName,
 FirstLetter,
 Count(itemName)
FROM table1
CROSS APPLY (SELECT substring(itemName, 1,1) as FirstLetter) Alias
GROUP BY itemName, FirstLetter

그룹 기준에서 별칭을 사용하면(예: 포스트그레스) 의도하지 않은 결과가 발생할 수 있습니다.예를 들어 내부 문에 이미 존재하는 별칭을 작성하는 경우 그룹 기준이 내부 필드 이름을 선택합니다.

-- Working example in postgres
select col1 as col1_1, avg(col3) as col2_1
from
    (select gender as col1, maritalstatus as col2, 
    yearlyincome as col3 from customer) as layer_1
group by col1_1;

-- Failing example in postgres
select col2 as col1, avg(col3)
from
    (select gender as col1, maritalstatus as col2,
    yearlyincome as col3 from customer) as layer_1
group by col1;

일부 DBMS를 사용하면 전체 식을 반복하는 대신 별칭을 사용할 수 있습니다.
Teradata가 그러한 예 중 하나입니다.

저는 이 SO 질문에 기록된 이유로 빌이 추천한 순서형 위치 표기법을 피합니다.

쉽고 강력한 대안은 항상 GROUP BY 절의 식을 반복하는 것입니다.
DRY는 SQL에 적용되지 않습니다.

SQLite의 보기에서 결과를 그룹화할 때 별칭을 사용하지 않도록 주의하십시오.별칭 이름이 기본 테이블의 열 이름(뷰에 대한)과 같으면 예기치 않은 결과가 표시됩니다.

Rdb는 Oracle에서 지원하는 이전 DEC 제품으로 GROUP BY에서 열 별칭을 사용할 수 있습니다. Mainstream Oracle에서 버전 11까지 열 별칭을 GROUP BY에서 사용할 수 없습니다.Postgresql, SQL Server, MySQL 등이 무엇을 허용할지 또는 허용하지 않을지 확신할 수 없습니다.YMMV.

적어도 Postgres에서는 절별 그룹의 별칭 이름을 사용할 수 있습니다.

항목 이름을 항목 이름 1로 선택, 하위 문자열(항목 이름, 1,1)을 첫 글자로 선택, 항목 이름 1로 표 1 GROUP BY 항목 이름, 첫 글자로 카운트(항목 이름);

대문자 변경으로 인해 혼란이 발생하는 별칭의 이름을 바꾸는 것은 권장하지 않습니다.

언급URL : https://stackoverflow.com/questions/3841295/sql-using-alias-in-group-by

반응형