SQL not recognizing column alias in where clause

后端 未结 3 1931
执念已碎
执念已碎 2020-12-03 14:26

I am only a beginner in SQL, but I\'ve come across this annoying error. SQL is having an issue with the WHERE clause of this script:

SELECT
  ITEM_ID, ITEM_P         


        
相关标签:
3条回答
  • 2020-12-03 15:05

    You cannot use the column name which is used as alias one in the query

    Reason:

    The query will first checks for runtime at that time the column name "item_total" is not found in the table "ORDER_ITEMS" because it was give as alias which is not stored in anywhere and you are assigning that column in desired output only

    Alternate:

    If you want to use that type go with sub queries it's performance is not good but it is one of the alternate way

    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;
    
    0 讨论(0)
  • 2020-12-03 15:10

    Starting from Oracle 12c you could use CROSS APPLY to define expression and then you could refer to them in WHERE clause:

    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;
    
    0 讨论(0)
  • 2020-12-03 15:27

    An alias can be used in a query select list to give a column a different name. You can use the alias in GROUP BY, ORDER BY, or HAVING clauses to refer to the column.

    Standard SQL disallows references to column aliases in a WHERE clause. This restriction is imposed because when the WHERE clause is evaluated, the column value may not yet have been determined.

    So, the following query is illegal:

    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>
    

    The column alias is allowed in:

    • GROUP BY
    • ORDER BY
    • HAVING

    You could refer to the column alias in WHERE clause in the following cases:

    1. Sub-query
    2. Common Table Expression(CTE)

    For example,

    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>
    
    0 讨论(0)
提交回复
热议问题