2015-03-02 2 views
3

Я только новичок в SQL, но я столкнулся с этой досадной ошибкой. 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

+6

Вашего название говорит все это. Алиасы столбцов не распознаются в предложении 'where'. Так работает SQL. Используйте подзапрос, CTE или повторите выражение. –

+0

* почему у него нет проблем с price_total или discount_total * Я не верю, что другие псевдонимы работают на вас. Можете ли вы показать нам. –

+0

также обратите внимание, что ваше сообщение об ошибке указывает на второй item_total ('Ошибка в командной строке: 7 столбцов: 7') и не жалуется на то же самое в строке 5. Удачи. – shellter

ответ

4

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.

Итак, следующий запрос является незаконным:

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> 

Столбец псевдоним допускается:

  • GROUP BY
  • ЗАКАЗАТЬ К
  • HAVING

Можно сослаться на псевдоним столбца в ИНЕКЕ в следующих случаях:

  1. Суб-запрос
  2. Общие Таблица Выражение (КТР)

Например,

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

вы не можете иметь возможность использовать имя столбца, который используется в качестве псевдонима одного в запросе

Причина:

qwery сначала проверяет время выполнения в то время как имя столбца «ITEM_TOTAL» не найден в таблице «ORDER_ITEMS», потому что это было дать как allias, который не находится в любом месте и вы назначаете этот столбец в желаемый результат только

Alternate:

Если вы хотите использовать этот тип пойти с подразделами запросами это производительность не хорошо, но это один из альтернативного пути

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; 
Смежные вопросы