Bạn không lọc truy vấn của mình, đây là lý do tại sao bạn hiển thị tất cả các nhân viên.
Điều này sẽ lọc những nhân viên kiếm được ít hơn mức tối đa cho loại nợ / cấp của họ:
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)
Bạn vẫn sẽ tìm thấy các bản sao vì ví dụ:hai người bán hàng kiếm được mức lương tối đa cho bậc 2 (cả Martin và Ward đều kiếm được 1250). Điều này có thể chấp nhận được hoặc bạn cần một số tiêu chí khác để chỉ chọn một trong số chúng.
Bạn có thể sử dụng row_number
hàm phân tích để đảm bảo rằng chỉ một hàng được trả về theo cấp / loại (lưu ý rằng Oracle sẽ chọn tùy ý một hàng khi có trùng lặp):
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