[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.당신은 문는 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.가상의 관계가 실제로 생성 될 때까지 자신을 별칭을 사용하여 추가 표현하면 그 위에 실행 추가 쿼리보다는 서브 쿼리로 사용하여 가상 관계를 만들어야합니다 수행하려는 경우 별칭은 사용할 수 없습니다. 나는 다음에 쿼리를 수정할 것이다 그래서 :
가상의 관계가 실제로 생성 될 때까지 자신을 별칭을 사용하여 추가 표현하면 그 위에 실행 추가 쿼리보다는 서브 쿼리로 사용하여 가상 관계를 만들어야합니다 수행하려는 경우 별칭은 사용할 수 없습니다. 나는 다음에 쿼리를 수정할 것이다 그래서 :
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.쿼리 (따라서 표현과 별칭의 평가)의 실행 순서는 기록 된 방법과 동일하지 않습니다. "일반"위치 조항이 순서로 평가되는 것이다 :
쿼리 (따라서 표현과 별칭의 평가)의 실행 순서는 기록 된 방법과 동일하지 않습니다. "일반"위치 조항이 순서로 평가되는 것이다 :
FROM WHERE GROUP BY HAVING SELECT ORDER BY
선택 조항이 완료 (당신이 ORDER BY 절에서 별칭을 사용할 수있는 이유입니다)까지 따라서 열 별칭은 쿼리의 대부분 알려져 있지 않다. FROM 절 성립하지만 테이블 별명 order by 절에 어디에서 이해된다.
가장 일반적인 해결 방법은 "파생 테이블"에 검색어를 캡슐화하는 것입니다
제안 읽기 : SQL 쿼리의 실행 순서
참고 : 다른 SQL DBMS 별명의 사용에 관한 다른 특정 규칙이
편집하다 논리 절 순서의 독자를 생각 나게 뒤에 목적은 자주 (항상은 아니지만) 별명은 별명이 선언 된 절 AFTER 참조 가능한되고 있다는 점이다. 의 가장 일반적인 SELECT 절에 선언 별명은 ORDER BY 절을 사용할 수 있다는 점입니다. 특히, 별칭은 SELECT 절에 같은 SELECT 절에서 참조 할 수 없습니다 선언했다.
그러나 제품의 차이로 인해하지 모든 DBMS는 이러한 방식으로 행동 할 것을 메모 해주세요
-
==============================
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;
from https://stackoverflow.com/questions/34955911/why-cant-i-use-column-aliases-in-the-next-select-expression by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL의 피벗 테이블의 열 데이터 행으로 (0) | 2020.05.05 |
---|---|
[SQL] 어떻게 오라클에서 일정 테이블을 채우는? (0) | 2020.05.05 |
[SQL] 사용 액세스 SQL은 그룹화 된 순위를 할 수 (0) | 2020.05.05 |
[SQL] 어떻게 SQL에서 두 날짜 사이에 "화요일"의 수를 계산하는? (0) | 2020.05.05 |
[SQL] 어떻게 PostgreSQL의를 사용하여 이전 달의 마지막 날을 결정합니까? (0) | 2020.05.05 |