복붙노트

[SQL] 왜 오라클 SQL은 우리가 GROUP BY 절에 열 별칭을 사용하는 것을 허용하지 않습니다?

SQL

왜 오라클 SQL은 우리가 GROUP BY 절에 열 별칭을 사용하는 것을 허용하지 않습니다?

이것은 SQL 쿼리를 작성하는 동안 일반적으로 직면하고있어 상황이다. 나는 표현에 의해 그룹에서 전체 열 (예를 들어 긴 경우 표현, 긴 매개 변수 합 기능) 대신 별명을 작성하는 쿼리 적은지를 읽을 수 있다고 생각합니다. 왜 오라클 SQL은 우리가 GROUP BY 절에 열 별칭을 사용하는 것을 허용하지 않습니다? 뒤에 중요한 이유가 있어야합니다.

해결법

  1. ==============================

    1.그것은 사실 나는 (내가 그에 대한 참조가없는 불구하고)는 ANSI SQL 표준에 부합하는 것으로 판단, 바로 오라클 SQL 아니다. 그 이유는 SELECT 절은 논리적 때문에 시간에 GROUP BY는 별명이 아직 존재하지 않는 완료, GROUP BY 절 이후에 처리되는 것입니다.

    그것은 사실 나는 (내가 그에 대한 참조가없는 불구하고)는 ANSI SQL 표준에 부합하는 것으로 판단, 바로 오라클 SQL 아니다. 그 이유는 SELECT 절은 논리적 때문에 시간에 GROUP BY는 별명이 아직 존재하지 않는 완료, 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
    
  2. ==============================

    2.나는이 오래된 스레드 알고 있지만, 사용자의 문제가 정말 해결되지 않은 것 같다; 그 설명은 GROUP BY 절에서는 별칭을 사용하지 않는 이유를 설명하는 좋은,하지만 대안이 부여되지 않았다.

    나는이 오래된 스레드 알고 있지만, 사용자의 문제가 정말 해결되지 않은 것 같다; 그 설명은 GROUP BY 절에서는 별칭을 사용하지 않는 이유를 설명하는 좋은,하지만 대안이 부여되지 않았다.

    select 절에서 별명이 메모리에 저장되기 전에 위의 정보를 바탕으로, 별칭은, 먼저 실행에 의해 이후 그룹이 그룹에서 사용할 수 없습니다. 내보기 위해 일한 간단한 솔루션은 외부 단순히 동일한 수준에서 다음 별칭 및 그룹을 선택하는 선택 추가했다 그래서.

    예:

    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
    

    아주 정직하고 처음으로 자신이 알아 내려고 경우 솔루션,하지만 피타를 참조하면.

    이 알 수있는 좋은 트릭 그래서 이것은 내가 case 문에서 파생 필드 "에 의해 그룹"을 수 있었던 유일한 방법입니다.

  3. ==============================

    3.나는 그것이 GROUP BY 절에서 별칭 참조 표현에 도움이 될 것입니다 동의하지만, 내 생각은 GROUP BY 절은 SELECT 절하기 전에 평가되기 때문에 할 수없는 것입니다.

    나는 그것이 GROUP BY 절에서 별칭 참조 표현에 도움이 될 것입니다 동의하지만, 내 생각은 GROUP BY 절은 SELECT 절하기 전에 평가되기 때문에 할 수없는 것입니다.

    (: ORDER BY 절은 마지막 평가 I-E)는 ORDER BY 절에 열 별칭을 사용할 수있는 이유도 설명 할 것입니다.

  4. ==============================

    4.그것은 논리적 인 대답을 보이지만, 사실 그것은 매우 사용자 쌀쌀 하나입니다. 오라클은 그것을 읽는 쿼리를 처리하기 전에, 그것을 읽어 전처리은 원래의 문으로 별명을 대체 할 수있는 여전히 데이터베이스에 올바른 정보를 제공해드립니다. 당신은 1,2,3으로 순서를 코딩 할 수 있습니다로 같은, 당신은 또한 1,2,3 또는 별명으로 그룹에 수 있어야합니다.

    그것은 논리적 인 대답을 보이지만, 사실 그것은 매우 사용자 쌀쌀 하나입니다. 오라클은 그것을 읽는 쿼리를 처리하기 전에, 그것을 읽어 전처리은 원래의 문으로 별명을 대체 할 수있는 여전히 데이터베이스에 올바른 정보를 제공해드립니다. 당신은 1,2,3으로 순서를 코딩 할 수 있습니다로 같은, 당신은 또한 1,2,3 또는 별명으로 그룹에 수 있어야합니다.

  5. ==============================

    5.그러나 일부 RDBMS는 PostgreSQL의에서이 작업을 수행합니다 :

    그러나 일부 RDBMS는 PostgreSQL의에서이 작업을 수행합니다 :

    select emp.lastname || ' ' || emp.firstname as fullname, count(emp_work.*) as cnt
    from emp
    left join emp_work using(emp_id)
    group by fullname
    

    그 의지 작업, 한 그룹화 된 별명이 집계 함수의 결과가 아니므로, CNT에 의해 그룹이 작동하지 않습니다

    하지만 전체 이름으로 그룹 emp.lastname에 의해 그룹으로 확장됩니다 것을 짐작 할 수 || ''|| 전체 이름으로 emp.firstname, 그리고 SELECT 절은 단지 그룹의 전체 이름 결과를 선택; 하지만 구문이 다른 방법으로 주위를 보인다. 그룹이 항상 먼저 실행 한 후 예상 마지막으로 (즉. SELECT)

  6. from https://stackoverflow.com/questions/2681494/why-doesnt-oracle-sql-allow-us-to-use-column-aliases-in-group-by-clauses by cc-by-sa and MIT license