Lý do cho lỗi này là SQL SELECT
tuyên bố về mặt logic * được xử lý theo thứ tự sau:
-
FROM
:lựa chọn một bảng hoặc nhiều bảng đã THAM GIA và tất cả các kết hợp hàng phù hợp vớiON
điều kiện. -
WHERE
:các điều kiện được đánh giá và các hàng không khớp sẽ bị xóa. -
GROUP BY
:các hàng được nhóm lại (và mọi nhóm thu gọn thành một hàng) -
HAVING
:các điều kiện được đánh giá và các hàng không khớp sẽ bị xóa. -
SELECT
:danh sách các cột được đánh giá. -
DISTINCT
:các hàng trùng lặp bị xóa (nếu đó là câu lệnh SELECT DISTINCT) -
UNION
,EXCEPT
,INTERSECT
:hành động của toán hạng đó được thực hiện trên các hàng của câu lệnh SELECT con. Ví dụ:nếu đó là UNION, tất cả các hàng được tập hợp (và các hàng trùng lặp bị loại trừ trừ khi đó là UNION ALL) sau khi tất cả các câu lệnh CHỌN phụ được đánh giá. Theo đó đối với các trường hợp NGOẠI LỆ hoặc INTERSECT. -
ORDER BY
:các hàng được sắp xếp.
Do đó, bạn không thể sử dụng trong WHERE
mệnh đề, một cái gì đó chưa được điền hoặc tính toán. Xem thêm câu hỏi này:oracle-sql-khoản-đánh giá-order
Lưu ý rằng các công cụ cơ sở dữ liệu cũng có thể chọn một thứ tự đánh giá khác cho một truy vấn (và đó là những gì chúng thường làm!) Hạn chế duy nhất là kết quả phải giống như khi thứ tự trên được sử dụng .
Giải pháp là đặt truy vấn trong một truy vấn khác :
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' ;
hoặc để sao chép phép tính trong điều kiện 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' ;
Tôi đoán đây là phiên bản đơn giản hóa của truy vấn của bạn hoặc bạn có thể sử dụng:
SELECT ename
, job
, 'SALES' AS department
FROM emp
WHERE deptno = 20 ;