Oracle
 sql >> Base de données >  >> RDS >> Oracle

Exemple de base de données Oracle SQL

Vous ne filtrez pas votre requête, c'est pourquoi tous les employés sont affichés.

Cela filtrerait les employés qui gagnent moins que le maximum pour leur service/grade :

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)

Vous trouverez toujours des doublons car, par exemple, deux personnes dans les ventes gagnent le salaire maximum pour le grade 2 (Martin et Ward gagnent tous deux 1250). Soit cela est acceptable, soit vous avez besoin d'autres critères pour n'en sélectionner qu'un.

Vous pouvez utiliser le row_number fonction analytique pour s'assurer qu'une seule ligne est renvoyée par grade/département (notez qu'Oracle sélectionnera arbitrairement une ligne lorsqu'il y a des doublons) :

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