sql >> Databáze >  >> RDS >> Oracle

Vzorová databáze Oracle SQL

Váš dotaz nefiltrujete, proto máte zobrazeny všechny zaměstnance.

To by odfiltrovalo zaměstnance, kteří vydělávají méně než maximum pro jejich oddělení/stupeň:

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)

Stále najdete duplikáty, protože například dva lidé v prodeji vydělávají maximální plat pro stupeň 2 (Martin i Ward vydělávají 1250). Buď je to přijatelné, nebo potřebujete nějaká další kritéria, abyste vybrali pouze jedno z nich.

Můžete použít row_number analytická funkce, která zajistí, že stupeň/oddělení vrátí pouze jeden řádek (všimněte si, že Oracle libovolně vybere jeden řádek, pokud existují duplikáty):

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. předávání id jména při kliknutí pomocí ajax do php

  2. Vrácení všech řádků s určitými podmínkami

  3. Jak make_interval() funguje v PostgreSQL

  4. Jak vytvořit blog v PHP a MySQL databázi - DB design