Oracle SQL에서 GROUP BY 절에 열 별칭을 사용할 수 없는 이유는 무엇입니까?
이것은 제가 SQL 쿼리를 작성하는 동안 일반적으로 직면하고 있는 상황입니다.GROUP BY 식의 별칭 대신 전체 열(예: 긴 대소문자 식, 긴 매개 변수가 있는 합계 함수)을 쓰는 것이 쿼리를 더 길고 덜 읽을 수 있게 한다고 생각합니다.Oracle SQL에서 GROUP BY 절의 열 별칭을 사용할 수 없는 이유는 무엇입니까?그 이면에는 분명 중요한 이유가 있을 것입니다.
Oracle SQL 뿐만 아니라 실제로는 ANSI SQL 표준을 준수하고 있다고 생각합니다(참고 자료는 없지만).그 이유는 GROUP BY 절 뒤에 SELECT 절이 논리적으로 처리되므로 GROUP BY가 완료된 시점에는 별칭이 아직 존재하지 않기 때문입니다.
이 다소 우스꽝스러운 예는 SQL이 피하는 문제와 모호성을 명확히 하는 데 도움이 될 것입니다.
SQL> select job as sal, sum(sal) as job
2 from scott.emp
3 group by job;
SAL JOB
--------- ----------
ANALYST 6000
CLERK 4150
MANAGER 8275
PRESIDENT 5000
SALESMAN 5600
오래된 스레드인 것은 알지만 사용자 문제가 실제로 해결되지 않은 것 같습니다. 그룹 바이 절에서 별칭을 사용할 수 없는 이유를 설명하는 데는 도움이 되었지만 대안이 제시되지 않았습니다.
위의 정보에 따르면 select 절의 별칭이 메모리에 저장되기 전에 group by가 먼저 실행되기 때문에 에 의해 그룹에서 별칭을 사용할 수 없습니다.그래서 제 견해에 맞는 간단한 해결책은 단순히 별칭을 선택하고 같은 수준으로 그룹화하는 외부 선택을 추가하는 것이었습니다.
예:
SELECT alias1, alias2, alias3, aliasN
FROM
(SELECT field1 as alias1, field2 as alias2, field3 as alias3, fieldN as aliasN
FROM tableName
WHERE ' ' = ' ')
GROUP BY alias1, alias2, alias3, aliasN
일단 해결책을 보면 꽤 간단하지만, 처음으로 혼자서 해결하려고 한다면 PITA입니다.
이것이 사례 진술에서 파생된 필드에 대해 "그룹화 기준"을 적용할 수 있는 유일한 방법이므로, 이 방법을 알아두는 것이 좋습니다.
GROUP BY 절에 별칭이 있는 표현식을 참조하는 것이 도움이 된다는 것에는 동의하지만, GROUP BY 절은 SELECT 절보다 먼저 평가되기 때문에 불가능할 것 같습니다.
이는 또한 ORDER BY 절에서 열 별칭을 사용할 수 있는 이유를 설명합니다(i-e: ORDER BY 절은 마지막으로 평가됨).
논리적인 답변처럼 보이지만, 사실은 매우 사용자 친화적이지 않은 답변입니다.쿼리를 처리하기 전에 Oracle은 쿼리를 읽고, 이를 읽음으로써 사전 처리자는 별칭을 원래 문으로 대체하고 올바른 쿼리를 데이터베이스로 전송할 수 있습니다.순서를 1,2,3으로 코드화할 수 있는 것과 마찬가지로 1,2,3 또는 별칭으로 그룹화할 수도 있습니다.
하지만 일부 RDBMS는 Postgre에서 작동합니다.SQL:
select emp.lastname || ' ' || emp.firstname as fullname, count(emp_work.*) as cnt
from emp
left join emp_work using(emp_id)
group by fullname
함수의 한 group by cnt가 없을 입니다.
저는 하지만저는수추있다습니할측히감▁that다.group by fullname으로 됩니다.group by emp.lastname || ' ' || emp.firstname as fullname은 해당합니다. . 먼저 last SELECT)입니다. 구문적으로는 반대로 보입니다. GROUP은 항상 먼저 실행되고, 투영은 마지막으로 실행됩니다(즉, SELECT).
언급URL : https://stackoverflow.com/questions/2681494/why-doesnt-oracle-sql-allow-us-to-use-column-aliases-in-group-by-clauses
'codememo' 카테고리의 다른 글
| 데이터 볼륨을 사용하는 MariaDB Docker 컨테이너 - 오류 2002, 소켓을 통해 연결할 수 없음 (0) | 2023.07.22 |
|---|---|
| 데이터베이스 열에서 행 생성 (0) | 2023.07.22 |
| Git: 모든 커밋을 제거하기 위해 원격 Git 저장소를 재설정하는 방법은 무엇입니까? (0) | 2023.07.17 |
| DataFrame의 문자열이지만 dtype은 개체입니다. (0) | 2023.07.17 |
| ((void*)0)이 null 포인터 상수입니까? (0) | 2023.07.17 |