sql >> Databasteknik >  >> RDS >> Oracle

Oracle SQL exempeldatabas

Du filtrerar inte din fråga, det är därför du har alla anställda som visas.

Detta skulle filtrera de anställda som tjänar mindre än maxvärdet för deras avdelning/betyg:

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)

Du kommer fortfarande att hitta dubbletter eftersom till exempel två personer i försäljning tjänar maxlönen för lönegrad 2 (både Martin och Ward tjänar 1250). Antingen är detta acceptabelt eller så behöver du några andra kriterier för att bara välja ett av dem.

Du kan använda row_number analytisk funktion för att säkerställa att endast en rad returneras av betyg/avdelning (observera att Oracle godtyckligt väljer en rad när det finns dubbletter) :

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 


  1. FEL:Kunde inte läsa rad 0, kol -1 från CursorWindow. Se till att markören är korrekt initierad innan du kommer åt data

  2. mysql resultset är alltid null

  3. Är det möjligt att stänga av offertbehandling i Postgres COPY-kommandot med CSV-format?

  4. Hur man lägger till total rad i MySQL