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 구문 요소가 실행되는 방식으로 정렬되지 않는다는 단순한 사실입니다.어휘 순서는 다음과 같습니다.
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
'sourcecode' 카테고리의 다른 글
이클립스에서 Spring MVC 프로젝트를 어떻게 만드나요? (0) | 2023.10.11 |
---|---|
모든 테이블에 기본 키가 있어야 합니까? (0) | 2023.10.11 |
ajax를 사용하여 wordPress menu를 통해 div의 카테고리별 최신 게시물 로드 (0) | 2023.10.06 |
점선(점선 아님!) 선 그리기, 2017년 IBDesignable (0) | 2023.10.06 |
보이드로 변환하거나 그 반대로 변환하는 것은 무엇을 의미합니까? (0) | 2023.10.06 |