Причината за тази грешка е, че SQL SELECT
твърденията салогически * обработени в следния ред:
-
FROM
:избор на една таблица или много JOINED и всички комбинации от редове, които съответстват наON
условия. -
WHERE
:условията се оценяват и редовете, които не съвпадат, се премахват. -
GROUP BY
:редовете са групирани (и всяка група се свива до един ред) -
HAVING
:условията се оценяват и редовете, които не съвпадат, се премахват. -
SELECT
:списъкът с колони се оценява. -
DISTINCT
:дублиращите се редове се премахват (ако е израз SELECT DISTINCT) -
UNION
,EXCEPT
,INTERSECT
:действието на този операнд се предприема върху редовете на под-SELECT оператори. Например, ако е UNION, всички редове се събират (и дубликатите се елиминират, освен ако не е UNION ALL), след като бъдат оценени всички изрази под-SELECT. Съответно за случаите EXCEPT или INTERSECT. -
ORDER BY
:редовете са подредени.
Следователно не можете да използвате в WHERE
клауза, нещо, което все още не е попълнено или изчислено. Вижте също този въпрос:oracle-sql-clause-evaluation-order
Обърнете внимание, че двигателите на базата данни могат също да изберат друг ред на оценка за заявка (и това е, което обикновено правят!) Единственото ограничение е, че резултатите трябва да са същите, както ако се използва горният редсилно> .
Решението е дазаключите заявката в другата :
SELECT *
FROM
( SELECT ename
, job
, CASE deptno
WHEN 10 THEN 'ACCOUNTS'
WHEN 20 THEN 'SALES'
ELSE 'UNKNOWN'
END AS department
FROM emp
) tmp
WHERE department = 'SALES' ;
или за дублиране на изчислението в условието WHERE :
SELECT ename
, job
, CASE deptno
WHEN 10 THEN 'ACCOUNTS'
WHEN 20 THEN 'SALES'
ELSE 'UNKNOWN'
END AS department
FROM emp
WHERE
CASE deptno
WHEN 10 THEN 'ACCOUNTS'
WHEN 20 THEN 'SALES'
ELSE 'UNKNOWN'
END = 'SALES' ;
Предполагам, че това е опростена версия на вашата заявка или бихте могли да използвате:
SELECT ename
, job
, 'SALES' AS department
FROM emp
WHERE deptno = 20 ;