3 回答

TA貢獻1805條經驗 獲得超9個贊
發生此錯誤的原因是,按照以下順序對SQL SELECT語句進行了邏輯 *處理:
FROM:選擇一個表或多個已聯接的表以及符合ON條件的所有行組合。
WHERE:評估條件,并刪除不匹配的行。
GROUP BY:將行分組(每組合為一行)
HAVING:評估條件,并刪除不匹配的行。
SELECT:評估列列表。
DISTINCT:刪除重復的行(如果它是SELECT DISTINCT語句)
UNION,EXCEPT,INTERSECT:那個操作的動作是在子SELECT語句的行拍攝。例如,如果它是UNION,則在評估所有子SELECT語句之后,將收集所有行(除非是UNION ALL,否則將刪除所有重復行)。因此,對于EXCEPT或INTERSECT情況。
ORDER BY:行是有序的。
因此,您不能使用in 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 ;

TA貢獻1786條經驗 獲得超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條經驗 獲得超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';
添加回答
舉報