3 回答

TA貢獻1805條經(jīng)驗 獲得超9個贊
發(fā)生此錯誤的原因是,按照以下順序?qū)QL SELECT語句進行了邏輯 *處理:
FROM:選擇一個表或多個已聯(lián)接的表以及符合ON條件的所有行組合。
WHERE:評估條件,并刪除不匹配的行。
GROUP BY:將行分組(每組合為一行)
HAVING:評估條件,并刪除不匹配的行。
SELECT:評估列列表。
DISTINCT:刪除重復(fù)的行(如果它是SELECT DISTINCT語句)
UNION,EXCEPT,INTERSECT:那個操作的動作是在子SELECT語句的行拍攝。例如,如果它是UNION,則在評估所有子SELECT語句之后,將收集所有行(除非是UNION ALL,否則將刪除所有重復(fù)行)。因此,對于EXCEPT或INTERSECT情況。
ORDER BY:行是有序的。
因此,您不能使用in WHERE子句(尚未填充或計算的東西)。另請參見以下問題:oracle-sql-clause-evaluation-order
* 邏輯處理: 請注意,數(shù)據(jù)庫引擎還可以為查詢選擇其他評估順序(這就是它們通常要做的?。Nㄒ坏南拗剖墙Y(jié)果應(yīng)與使用上述順序相同。
解決方案是將查詢括在另一個查詢中:
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條件下重復(fù)計算:
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 ;

TA貢獻1786條經(jīng)驗 獲得超11個贊
您的表不包含“部門”列,因此您不能在where子句中引用它。請改用deptno。
SELECT ename
, job
, CASE deptno
WHEN 10
THEN 'ACCOUNTS'
WHEN 20
THEN 'SALES'
ELSE 'UNKNOWN'
END AS department
FROM emp /* !!! */ where deptno = 20;

TA貢獻1877條經(jīng)驗 獲得超1個贊
select emp_.*
from (SELECT ename
, job
, CASE deptno
WHEN 10
THEN 'ACCOUNTS'
WHEN 20
THEN 'SALES'
ELSE 'UNKNOWN'
END AS department
FROM emp /* !!! */ ) emp_ where emp_.department='UNKNOWN';
添加回答
舉報