복붙노트

[SQL] 이유는 다음 SELECT 표현에 열 별칭을 사용할 수 없습니다?

SQL

이유는 다음 SELECT 표현에 열 별칭을 사용할 수 없습니다?

나는 식 ROUND (avg_time * CNT, 2)의 별칭 avg_time 열 및 탄소 나노 튜브를 사용하여 다음을 수정할 수 있습니까?

SELECT 
    COALESCE(ROUND(stddev_samp(time), 2), 0) as stddev_time, 
    MAX(time) as max_time, 
    ROUND(AVG(time), 2) as avg_time, 
    MIN(time) as min_time, 
    COUNT(path) as cnt, 
    ROUND(avg_time * cnt, 2) as slowdown, path
FROM 
    loadtime
GROUP BY
    path
ORDER BY
    avg_time DESC
LIMIT 10;

그것은 다음 오류가 발생합니다 :

ERROR:  column "avg_time" does not exist
LINE 7:  ROUND(avg_time * cnt, 2) as slowdown, path

제 1, 그러나, 다음 작동 미세 (대신 열 별명의 주 식을 사용하여 :

SELECT 
    COALESCE(ROUND(stddev_samp(time), 2), 0) as stddev_time, 
    MAX(time) as max_time, 
    ROUND(AVG(time), 2) as avg_time, 
    MIN(time) as min_time, 
    COUNT(path) as cnt, 
    ROUND(AVG(time) * COUNT(path), 2) as slowdown, path
FROM 
    loadtime
GROUP BY
    path
ORDER BY
    avg_time DESC
LIMIT 10;

해결법

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

    1.당신은 문는 SELECT 또는 WHERE 또는 문을 HAVING 아니라 그룹에서 이전에 만든 별칭을 사용할 수 있습니다. 프로그램이 동시에 SELECT 문을 모두 처리하고 아직 별명의 가치를 알지 못하기 때문입니다.

    당신은 문는 SELECT 또는 WHERE 또는 문을 HAVING 아니라 그룹에서 이전에 만든 별칭을 사용할 수 있습니다. 프로그램이 동시에 SELECT 문을 모두 처리하고 아직 별명의 가치를 알지 못하기 때문입니다.

    이 솔루션은 하위 쿼리에서 쿼리를 캡슐화하는 다음 별칭은 외부에서 사용할 수 있습니다.

    SELECT stddev_time, max_time, avg_time, min_time, cnt, 
           ROUND(avg_time * cnt, 2) as slowdown
    FROM (
            SELECT 
                COALESCE(ROUND(stddev_samp(time), 2), 0) as stddev_time, 
                MAX(time) as max_time, 
                ROUND(AVG(time), 2) as avg_time, 
                MIN(time) as min_time, 
                COUNT(path) as cnt, 
                path
            FROM 
                loadtime
            GROUP BY
                path
            ORDER BY
                avg_time DESC
            LIMIT 10
       ) X;
    
  2. ==============================

    2.가상의 관계가 실제로 생성 될 때까지 자신을 별칭을 사용하여 추가 표현하면 그 위에 실행 추가 쿼리보다는 서브 쿼리로 사용하여 가상 관계를 만들어야합니다 수행하려는 경우 별칭은 사용할 수 없습니다. 나는 다음에 쿼리를 수정할 것이다 그래서 :

    가상의 관계가 실제로 생성 될 때까지 자신을 별칭을 사용하여 추가 표현하면 그 위에 실행 추가 쿼리보다는 서브 쿼리로 사용하여 가상 관계를 만들어야합니다 수행하려는 경우 별칭은 사용할 수 없습니다. 나는 다음에 쿼리를 수정할 것이다 그래서 :

    SELECT stddev_time, max_time, avg_time, min_time, ROUND(avg_time * cnt, 2) as slowdown, path FROM
    (
    SELECT 
        COALESCE(ROUND(stddev_samp(time), 2), 0) as stddev_time, 
        MAX(time) as max_time, 
        ROUND(AVG(time), 2) as avg_time, 
        MIN(time) as min_time, 
        COUNT(path) as cnt, 
        ROUND(AVG(time) * COUNT(path), 2) as slowdown, path
    FROM 
        loadtime
    GROUP BY
        path
    ORDER BY
        avg_time DESC
    LIMIT 10;
    )
    

    나는 당신이 그들을 쿼리하고 테이블에 직접 정의 된 쿼리 계획이 그 열을 인식하기 때문에 두 번째 쿼리가 작동하는 이유가 여기에 추가 할.

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

    3.쿼리 (따라서 표현과 별칭의 평가)의 실행 순서는 기록 된 방법과 동일하지 않습니다. "일반"위치 조항이 순서로 평가되는 것이다 :

    쿼리 (따라서 표현과 별칭의 평가)의 실행 순서는 기록 된 방법과 동일하지 않습니다. "일반"위치 조항이 순서로 평가되는 것이다 :

    FROM
    WHERE
    GROUP BY
    HAVING
    SELECT
    ORDER BY
    

    선택 조항이 완료 (당신이 ORDER BY 절에서 별칭을 사용할 수있는 이유입니다)까지 따라서 열 별칭은 쿼리의 대부분 알려져 있지 않다. FROM 절 성립하지만 테이블 별명 order by 절에 어디에서 이해된다.

    가장 일반적인 해결 방법은 "파생 테이블"에 검색어를 캡슐화하는 것입니다

    제안 읽기 : SQL 쿼리의 실행 순서

    참고 : 다른 SQL DBMS 별명의 사용에 관한 다른 특정 규칙이

    편집하다 논리 절 순서의 독자를 생각 나게 뒤에 목적은 자주 (항상은 아니지만) 별명은 별명이 선언 된 절 AFTER 참조 가능한되고 있다는 점이다. 의 가장 일반적인 SELECT 절에 선언 별명은 ORDER BY 절을 사용할 수 있다는 점입니다. 특히, 별칭은 SELECT 절에 같은 SELECT 절에서 참조 할 수 없습니다 선언했다.

    그러나 제품의 차이로 인해하지 모든 DBMS는 이러한 방식으로 행동 할 것을 메모 해주세요

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

    4.어느 표현을 반복한다 :

    어느 표현을 반복한다 :

    ROUND(ROUND(AVG(time), 2) * COUNT(path), 2) as slowdown
    

    또는 하위 쿼리를 사용합니다 :

    SELECT *, ROUND(avg_time * cnt, 2) as slowdown FROM (
      SELECT 
        COALESCE(ROUND(stddev_samp(time), 2), 0) as stddev_time, 
        MAX(time) as max_time, 
        ROUND(AVG(time), 2) as avg_time, 
        MIN(time) as min_time, 
        COUNT(path) as cnt, 
        path
      FROM loadtime
      GROUP BY path) x
    ORDER BY avg_time DESC
    LIMIT 10;
    
  5. from https://stackoverflow.com/questions/34955911/why-cant-i-use-column-aliases-in-the-next-select-expression by cc-by-sa and MIT license