SQL无法识别where子句中的列别名

Som*_*mus 7 sql oracle column-alias

我只是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;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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:
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它与price_total和discount_total没有问题,但是报告item_total无效.我试图在减去折扣金额时首先仅选择总数大于500的项目,并将其乘以数量.然后,我需要按item_total按降序对结果进行排序

Lal*_*r B 16

可以在查询选择列表中使用别名为列提供不同的名称.您可以使用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>
Run Code Online (Sandbox Code Playgroud)

列别名允许在:

  • 通过...分组
  • 订购
  • HAVING

在以下情况下,您可以引用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>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在 Oracle 中,您不能在“GROUP BY”或“HAVING”中使用“别名”。 (4认同)
  • 感谢您对为什么存在这种不直观的行为给出了合理的解释。 (2认同)