Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Przykładowa baza danych Oracle SQL

Nie filtrujesz swojego zapytania, dlatego wyświetlasz wszystkich pracowników.

Spowoduje to odfiltrowanie pracowników, którzy zarabiają mniej niż maks. dla swojego działu/klasu:

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)

Nadal znajdziesz duplikaty, ponieważ na przykład dwie osoby w sprzedaży zarabiają maksymalną pensję za stopień 2 (zarówno Martin, jak i Ward zarabiają 1250). Albo jest to dopuszczalne, albo potrzebujesz innych kryteriów, aby wybrać tylko jedno z nich.

Możesz użyć row_number funkcja analityczna zapewniająca, że ​​tylko jeden wiersz zostanie zwrócony przez stopień/dział (należy zauważyć, że Oracle wybierze arbitralnie jeden wiersz, gdy występują duplikaty):

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Procedura składowana Oracle i niestandardowy typ danych

  2. Nie znaleziono regionu strefy czasowej

  3. Klient błyskawiczny Docker Oracle

  4. ORA-01658:nie można utworzyć INITIAL ekstentu dla segmentu w przestrzeni tabel TS_DATA

  5. Oracle sql nie jest grupą według wyrażenia podczas zliczania