sourcecode

Oracle 별칭 이해 - 두 번째 쿼리로 래핑하지 않는 한 쿼리에서 별칭이 인식되지 않는 이유는 무엇입니까?

copyscript 2023. 10. 6. 21:56
반응형

Oracle 별칭 이해 - 두 번째 쿼리로 래핑하지 않는 한 쿼리에서 별칭이 인식되지 않는 이유는 무엇입니까?

질문이 있습니다.


SELECT COUNT(*) AS "CNT",
       imei
FROM   devices  

잘 실행되는군요WHERE 문으로 쿼리를 더 제한하고 싶습니다.(인간적으로) 논리적인 다음 단계는 쿼리를 다음과 같이 수정하는 것입니다.


SELECT COUNT(*) AS "CNT",
       imei
FROM   devices
WHERE  CNT > 1 

그러나 이로 인해 ORA-00904: "CNT": 잘못된 식별자라는 오류 메시지가 나타납니다.어떤 이유로 쿼리를 다른 쿼리로 래핑하면 원하는 결과가 나타납니다.


SELECT *
FROM   (SELECT COUNT(*) AS "CNT",
               imei
        FROM   devices
        GROUP  BY imei)
WHERE  CNT > 1  

Oracle이 두 번째 쿼리에서 별칭 "CNT"를 인식하지 못하는 이유는 무엇입니까?

문서에 다음과 같은 내용이 없기 때문입니다.

열 표현식의 별칭을 지정합니다.Oracle Database는 결과 집합의 열 제목에 이 별칭을 사용합니다.AS 키워드는 선택 사항입니다.별칭은 쿼리 기간 동안 선택한 목록 항목의 이름을 효과적으로 바꿉니다.별칭은 order_by_clause에서 사용할 수 있지만 쿼리의 다른 절에서는 사용할 수 없습니다.

그러나 내부 선택이 있을 경우 열 별칭이 적용되는 인라인 뷰를 생성하는 것과 같으므로 외부 수준에서 이를 사용할 수 있습니다.

간단한 답은 다음과 같습니다.AS절은 결과에서 열을 호출할 내용을 정의하며, 이는 쿼리 자체와는 다른 범위입니다.

예를 들어, 를 사용하는 경우HAVING절이 가장 적합합니다.

SELECT COUNT(*) AS "CNT",
       imei
FROM   devices
GROUP  BY imei
HAVING COUNT(*) > 1

요약하자면, 이 작은 보석은 다음과 같이 설명합니다.

SQL을 완벽하게 이해하기 위한 10가지 쉬운 단계

일반적인 혼란의 원인은 SQL 구문 요소가 실행되는 방식으로 정렬되지 않는다는 단순한 사실입니다.어휘 순서는 다음과 같습니다.

SELECT [ DISTINCT ]
FROM
WHERE
GROUP BY
HAVING
UNION
ORDER BY

단순화를 위해 모든 SQL 절이 나열되는 것은 아닙니다.이 어휘 순서는 논리적 순서, 즉 실행 순서와는 근본적으로 다릅니다.

FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
ORDER BY

따라서 "AS"를 사용하여 레이블을 지정하는 모든 것은 한 번만 사용할 수 있습니다.WHERE,HAVING그리고.GROUP BY이미 수행되었습니다.

WHERE 절이 처리되고 데이터가 생성되기 전까지는 결과 열에 별칭이 할당되지 않기 때문이라고 생각합니다.Oracle은 이 동작에서 다른 DBMS와 다른가요?

언급URL : https://stackoverflow.com/questions/6153778/understanding-oracle-aliasing-why-isnt-an-alias-not-recognized-in-a-query-unl

반응형