इस त्रुटि का कारण यह है कि SQL SELECT
कथन तार्किक रूप से हैं ** निम्नलिखित क्रम में संसाधित:
-
FROM
:एक टेबल या कई जॉइन वाले और सभी पंक्तियों के संयोजन का चयन जोON
से मेल खाते हैं शर्तें। -
WHERE
:शर्तों का मूल्यांकन किया जाता है और मेल नहीं खाने वाली पंक्तियों को हटा दिया जाता है। -
GROUP BY
:पंक्तियों को समूहीकृत किया जाता है (और प्रत्येक समूह एक पंक्ति में सिमट जाता है) -
HAVING
:शर्तों का मूल्यांकन किया जाता है और मेल नहीं खाने वाली पंक्तियों को हटा दिया जाता है। -
SELECT
:स्तंभों की सूची का मूल्यांकन किया जाता है। -
DISTINCT
:डुप्लीकेट पंक्तियों को हटा दिया जाता है (यदि यह एक SELECT DISTINCT स्टेटमेंट है) -
UNION
,EXCEPT
,INTERSECT
:उस ऑपरेंड की कार्रवाई उप-चयन कथनों की पंक्तियों पर की जाती है। उदाहरण के लिए, यदि यह एक यूनियन है, तो सभी उप-चयन कथनों के मूल्यांकन के बाद सभी पंक्तियों को इकट्ठा किया जाता है (और जब तक यह यूनियन ऑल नहीं है तब तक डुप्लिकेट समाप्त हो जाते हैं)। तद्नुसार 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 ;