Alasan kesalahan ini adalah bahwa SQL SELECT
pernyataan secara logis * diproses dalam urutan berikut:
-
FROM
:pemilihan satu tabel atau banyak yang BERGABUNG dan semua kombinasi baris yang cocok denganON
kondisi. -
WHERE
:kondisi dievaluasi dan baris yang tidak cocok dihapus. -
GROUP BY
:baris dikelompokkan (dan setiap grup diciutkan menjadi satu baris) -
HAVING
:kondisi dievaluasi dan baris yang tidak cocok dihapus. -
SELECT
:daftar kolom dievaluasi. -
DISTINCT
:baris duplikat dihapus (jika pernyataan SELECT DISTINCT) -
UNION
,EXCEPT
,INTERSECT
:tindakan operan itu diambil pada baris pernyataan sub-SELECT. Misalnya, jika itu UNION, semua baris dikumpulkan (dan duplikat dihilangkan kecuali UNION ALL) setelah semua pernyataan sub-SELECT dievaluasi. Sesuai untuk kasus KECUALI atau INTERSECT. -
ORDER BY
:baris diurutkan.
Oleh karena itu, Anda tidak dapat menggunakan di WHERE
klausa, sesuatu yang belum diisi atau dihitung. Lihat juga pertanyaan ini:Oracle-sql-clause-evaluation-order
Perhatikan bahwa mesin basis data mungkin juga memilih urutan evaluasi lain untuk kueri (dan itulah yang biasanya mereka lakukan!) Satu-satunya batasan adalah hasilnya harus sama seperti jika urutan di atas digunakan .
Solusinya adalah melampirkan kueri di kueri lain :
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' ;
atau untuk menggandakan perhitungan dalam kondisi 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' ;
Saya rasa ini adalah versi sederhana dari kueri Anda atau Anda dapat menggunakan:
SELECT ename
, job
, 'SALES' AS department
FROM emp
WHERE deptno = 20 ;