sourcecode

SQL이 where 절에서 열 별칭을 인식하지 못합니다.

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

SQL이 where 절에서 열 별칭을 인식하지 못합니다.

SQL에서 이 스크립트의 WHERE 절에 문제가 있습니다.

SELECT
  ITEM_ID, ITEM_PRICE, DISCOUNT_AMOUNT, QUANTITY, 
  (ITEM_PRICE*QUANTITY) AS price_total, 
  (DISCOUNT_AMOUNT*QUANTITY) AS discount_total, 
  ((ITEM_PRICE-DISCOUNT_AMOUNT)*QUANTITY) AS item_total
FROM ORDER_ITEMS
WHERE item_total > 500
ORDER BY item_total;

다음 오류가 발생했습니다.

Error starting at line : 1 in command -
SELECT 
  ITEM_ID, ITEM_PRICE, DISCOUNT_AMOUNT, QUANTITY,  
  (ITEM_PRICE*QUANTITY) AS price_total,  
  (DISCOUNT_AMOUNT*QUANTITY) AS discount_total,  
  ((ITEM_PRICE-DISCOUNT_AMOUNT)*QUANTITY) AS item_total 
FROM ORDER_ITEMS 
WHERE item_total > 500 
ORDER BY item_total DESC;
Error at Command Line : 7 Column : 7
Error report -
SQL Error: ORA-00904: "ITEM_TOTAL": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:

price_total 또는 discount_total에 문제가 없는데 item_total을 무효로 보고하는 이유는 무엇입니까?

저는 우선 할인 금액을 빼고 수량을 곱하면 총 500개 이상의 품목만 선택하려고 합니다.그러면, 저는 결과를 item_total 순으로 내림차순으로 정렬해야 합니다.

별칭을 쿼리 선택 목록에서 사용하여 열에 다른 이름을 지정할 수 있습니다.GROUP BY, ORDER BY 또는 HAVING 절의 별칭을 사용하여 열을 참조할 수 있습니다.

표준 SQL은 WHERE 절의 열 별칭에 대한 참조를 허용하지 않습니다.WHERE 절을 평가할 때 열 값이 아직 결정되지 않았을 수 있기 때문에 이 제한이 적용됩니다.

따라서 다음 쿼리는 불법입니다.

SQL> SELECT empno AS employee, deptno AS department, sal AS salary
  2  FROM emp
  3  WHERE employee = 7369;
WHERE employee = 7369
      *
ERROR at line 3:
ORA-00904: "EMPLOYEE": invalid identifier


SQL>

열 별칭은 다음에서 허용됩니다.

  • 그룹화 기준
  • 주문 기준
  • 하고 있다

다음과 같은 경우 WHERE 절의 열 별칭을 참조할 수 있습니다.

  1. 하위 쿼리
  2. 공통 테이블 식(CTE)

예를들면,

SQL> SELECT * FROM
  2  (
  3  SELECT empno AS employee, deptno AS department, sal AS salary
  4  FROM emp
  5  )
  6  WHERE employee = 7369;

  EMPLOYEE DEPARTMENT     SALARY
---------- ---------- ----------
      7369         20        800

SQL> WITH DATA AS(
  2  SELECT empno AS employee, deptno AS department, sal AS salary
  3  FROM emp
  4  )
  5  SELECT * FROM DATA
  6  WHERE employee = 7369;

  EMPLOYEE DEPARTMENT     SALARY
---------- ---------- ----------
      7369         20        800

SQL>

Oracle 12c부터 사용 가능CROSS APPLY표현을 정의하고 다음에서 참조할 수 있습니다.WHERE절:

SELECT
  o.ITEM_ID, o.ITEM_PRICE, o.DISCOUNT_AMOUNT, o.QUANTITY, 
  s.price_total, s.discount_total, s.item_total
FROM ORDER_ITEMS o
CROSS APPLY (SELECT ITEM_PRICE*QUANTITY AS price_total, 
                    DISCOUNT_AMOUNT*QUANTITY AS discount_total, 
                  (ITEM_PRICE-DISCOUNT_AMOUNT)*QUANTITY AS item_total FROM dual) s
WHERE s.item_total > 500
ORDER BY s.item_total;

쿼리에서 별칭으로 사용되는 열 이름을 사용할 수 없습니다.

이유:

쿼리는 먼저 "Item_total" 열 이름이 "ORDER_ITES" 테이블에서 찾을 수 없는 런타임을 확인합니다. 이 열이 어디에도 저장되지 않은 별칭으로 지정되었으며 원하는 출력에만 해당 열을 할당하고 있기 때문입니다.

대체:

하위 쿼리와 함께 이동 유형을 사용하려면 성능이 좋지 않지만 다른 방법 중 하나입니다.

SELECT * FROM
 (SELECT
  ITEM_ID, ITEM_PRICE, DISCOUNT_AMOUNT, QUANTITY, 
  (ITEM_PRICE*QUANTITY) AS price_total, 
  (DISCOUNT_AMOUNT*QUANTITY) AS discount_total, 
  ((ITEM_PRICE-DISCOUNT_AMOUNT)*QUANTITY) AS item_total
 FROM ORDER_ITEMS) as  tbl
WHERE tbl.item_total > 500
ORDER BY tbl.item_total;

언급URL : https://stackoverflow.com/questions/28802134/sql-not-recognizing-column-alias-in-where-clause

반응형