복붙노트

[SQL] SQL은 where 절에 열 별칭을 인식하지

SQL

SQL은 where 절에 열 별칭을 인식하지

나는 SQL 만 초보자,하지만 나는이 짜증나는 오류 건너했습니다. 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으로 내림차순 결과를 정렬 할 필요가

해결법

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

    1.그래서, 다음 쿼리는 불법입니다 :

    그래서, 다음 쿼리는 불법입니다 :

    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 절에 다음과 같은 경우 :

    예를 들어,

    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>
    
  2. ==============================

    2.당신은 조회에서 별명 하나로서 사용되는 열 이름을 사용할 수 없습니다

    당신은 조회에서 별명 하나로서 사용되는 열 이름을 사용할 수 없습니다

    이유:

    쿼리 것이다 당시 런타임 먼저 확인 열 이름 "ITEM_TOTAL는"이 어디에 저장되어 있지 않은 별칭으로 제공 되었기 때문에 테이블 "ORDER_ITEMS"에서 발견되지 않고 당신이 원하는 출력에 해당 열을 지정하는 경우에만

    번갈아 하는:

    당신은 서브가 그것의 성능이 좋지 않은 쿼리 유형의 이동을 사용하고자하지만 다른 방법 중 하나 인 경우

    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;
    
  3. ==============================

    3.당신은 CROSS 표현을 정의하는 데 적용 사용할 수있는 오라클 12C에서 시작하고 어디에서 그들에게 참조 할 수 절 :

    당신은 CROSS 표현을 정의하는 데 적용 사용할 수있는 오라클 12C에서 시작하고 어디에서 그들에게 참조 할 수 절 :

    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;
    
  4. from https://stackoverflow.com/questions/28802134/sql-not-recognizing-column-alias-in-where-clause by cc-by-sa and MIT license