आप अपनी क्वेरी को फ़िल्टर नहीं कर रहे हैं, इसलिए आपने सभी कर्मचारियों को प्रदर्शित किया है।
यह उन कर्मचारियों को फ़िल्टर करेगा जो अपने विभाग/ग्रेड के लिए अधिकतम से कम कमाते हैं:
SELECT ename, salgrade.grade, dept.dname
FROM emp, salgrade, dept
WHERE emp.sal BETWEEN salgrade.losal AND salgrade.hisal
AND emp.deptno = dept.deptno
AND emp.sal = (SELECT MAX(sal)
FROM emp emp_in, salgrade grade_in
WHERE emp_in.sal BETWEEN grade_in.losal AND grande_in.hisal
AND emp_in.deptno = emp.deptno
AND grade_in.losal = salgrade.losal)
आपको अभी भी डुप्लीकेट मिलेंगे क्योंकि उदाहरण के लिए, बिक्री में दो लोग ग्रेड 2 के लिए अधिकतम वेतन अर्जित करते हैं (मार्टिन और वार्ड दोनों 1250 कमाते हैं)। या तो यह स्वीकार्य है या उनमें से केवल एक को चुनने के लिए आपको कुछ अन्य मानदंडों की आवश्यकता है।
आप row_number
. का उपयोग कर सकते हैं विश्लेषणात्मक कार्य यह सुनिश्चित करने के लिए कि ग्रेड/विभाग द्वारा केवल एक पंक्ति लौटा दी जाती है (ध्यान दें कि डुप्लिकेट होने पर Oracle मनमाने ढंग से एक पंक्ति का चयन करेगा):
SELECT * FROM (
SELECT ename, salgrade.grade, dept.dname,
row_number() OVER (PARTITION BY dept.deptno, salgrade.grade
ORDER BY emp.sal DESC) rnk
FROM emp, salgrade, dept
WHERE emp.sal BETWEEN salgrade.losal AND salgrade.hisal
AND emp.deptno = dept.deptno
) WHERE rnk = 1;
ENAME GRADE DNAME RNK
---------- ------ -------------- ---
MILLER 2 ACCOUNTING 1
CLARK 4 ACCOUNTING 1
KING 5 ACCOUNTING 1
ADAMS 1 RESEARCH 1
FORD 4 RESEARCH 1
JAMES 1 SALES 1
MARTIN 2 SALES 1
ALLEN 3 SALES 1
BLAKE 4 SALES 1