2012-01-09 35 views
1

我試圖瞭解Oracle SQL由它提供的數據庫。 我發現某處要完成的任務。 數據庫結構Oracle提供:的Oracle SQL示例數據庫

CREATE TABLE EMP 
(EMPNO NUMERIC(4) NOT NULL, 
ENAME VARCHAR(10), 
JOB VARCHAR(9), 
MGR NUMERIC(4), 
HIREDATE DATETIME, 
SAL NUMERIC(7, 2), 
COMM NUMERIC(7, 2), 
DEPTNO NUMERIC(2)) 

INSERT INTO EMP VALUES 
(7369, 'SMITH', 'CLERK', 7902, '17-DEC-1980', 800, NULL, 20) 
INSERT INTO EMP VALUES 
(7499, 'ALLEN', 'SALESMAN', 7698, '20-FEB-1981', 1600, 300, 30) 
INSERT INTO EMP VALUES 
(7521, 'WARD', 'SALESMAN', 7698, '22-FEB-1981', 1250, 500, 30) 
INSERT INTO EMP VALUES 
(7566, 'JONES', 'MANAGER', 7839, '2-APR-1981', 2975, NULL, 20) 
INSERT INTO EMP VALUES 
(7654, 'MARTIN', 'SALESMAN', 7698, '28-SEP-1981', 1250, 1400, 30) 
INSERT INTO EMP VALUES 
(7698, 'BLAKE', 'MANAGER', 7839, '1-MAY-1981', 2850, NULL, 30) 
INSERT INTO EMP VALUES 
(7782, 'CLARK', 'MANAGER', 7839, '9-JUN-1981', 2450, NULL, 10) 
INSERT INTO EMP VALUES 
(7788, 'SCOTT', 'ANALYST', 7566, '09-DEC-1982', 3000, NULL, 20) 
INSERT INTO EMP VALUES 
(7839, 'KING', 'PRESIDENT', NULL, '17-NOV-1981', 5000, NULL, 10) 
INSERT INTO EMP VALUES 
(7844, 'TURNER', 'SALESMAN', 7698, '8-SEP-1981', 1500, 0, 30) 
INSERT INTO EMP VALUES 
(7876, 'ADAMS', 'CLERK', 7788, '12-JAN-1983', 1100, NULL, 20) 
INSERT INTO EMP VALUES 
(7900, 'JAMES', 'CLERK', 7698, '3-DEC-1981', 950, NULL, 30) 
INSERT INTO EMP VALUES 
(7902, 'FORD', 'ANALYST', 7566, '3-DEC-1981', 3000, NULL, 20) 
INSERT INTO EMP VALUES 
(7934, 'MILLER', 'CLERK', 7782, '23-JAN-1982', 1300, NULL, 10) 

CREATE TABLE DEPT 
(DEPTNO NUMERIC(2), 
DNAME VARCHAR(14), 
LOC VARCHAR(13)) 

INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK') 
INSERT INTO DEPT VALUES (20, 'RESEARCH', 'DALLAS') 
INSERT INTO DEPT VALUES (30, 'SALES', 'CHICAGO') 
INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON') 

CREATE TABLE BONUS 
(ENAME VARCHAR(10), 
JOB VARCHAR(9), 
SAL NUMERIC, 
COMM NUMERIC) 

CREATE TABLE SALGRADE 
(GRADE NUMERIC, 
LOSAL NUMERIC, 
HISAL NUMERIC) 

INSERT INTO SALGRADE VALUES (1, 700, 1200) 
INSERT INTO SALGRADE VALUES (2, 1201, 1400) 
INSERT INTO SALGRADE VALUES (3, 1401, 2000) 
INSERT INTO SALGRADE VALUES (4, 2001, 3000) 
INSERT INTO SALGRADE VALUES (5, 3001, 9999) 

現在我想選擇最賺他們的部門和員工salgrade。

我寫的是這樣的一個:

select ename, salgrade.grade, dept.dname from emp, salgrade, dept 
WHERE emp.sal BETWEEN salgrade.losal AND salgrade.hisal 
AND emp.deptno = dept.deptno group by salgrade.grade, dept.dname, emp.ename 

但它不能正常工作。 輸出是:

ENAME GRADE DNAME 
SMITH 1 RESEARCH 
BLAKE 4 SALES 
FORD  4 RESEARCH 
KING  5 ACCOUNTING 
SCOTT 4 RESEARCH 
MILLER 2 ACCOUNTING 
TURNER 3 SALES 
WARD  2 SALES 
MARTIN 2 SALES 
ADAMS 1 RESEARCH 
JONES 4 RESEARCH 
JAMES 1 SALES 
CLARK 4 ACCOUNTING 
ALLEN 3 SALES 

注行:

WARD 2 SALES 
MARTIN 2 SALES 

2人來自同一部門和salgrade。

你能指出我我的錯誤?

+0

你能告訴我在哪裏可以找到這種類型的問題嗎?我正在練習Oracle sql,如果我可以自行完成Oracle的練習,那就太好了。謝謝 – anirban 2015-04-07 11:31:16

回答

1

你是不是篩選查詢,這就是爲什麼你必須顯示的所有員工。

這將篩選收入低於最大值爲他們的部門/職員工:

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) 

你仍然會發現重複的,因爲比如,兩個人在銷售收入最大工資2級(包括馬丁和沃德賺1250)。要麼這是可以接受的,要麼你需要其他一些標準來選擇其中的一個。

可以使用row_number分析功能,以確保只有一個行由級/部門返回(注意,Oracle將選擇任意一行時有重複):

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

你是員工姓名,以及部門和工資等級分組。這意味着您將針對數據集中的每個員工姓名,部門和工資等級組合返回一行。

要確保你只每個部門和工資等級返回一行,則需要通過條款從該組中刪除的員工姓名。這將使你發現每級和部門的最高薪水,而不是它的員工有薪水 - 要做到這一點,你需要重新加入的結果反饋給員工表,就像這樣:

select e.ename, s.grade, d.dname, e.salary 
from (select max(emp.salary) max_salary, 
      salgrade.grade, 
      emp.deptno 
     from emp, salgrade 
     WHERE emp.sal BETWEEN salgrade.losal AND salgrade.hisal 
     group by salgrade.grade, dept.dname) s 
    join emp e on e.salary = s.max_salary 
    join dept d on e.deptno = d.deptno 

注如果同一部門的多名僱員在其年級中獲得相同的最高工資,那麼這兩名僱員都將被退回 - 這應該在FORD和SCOTT的研究中發生。

1

與您`選擇:

select ename, salgrade.grade, dept.dname from emp, salgrade, dept 
WHERE emp.sal BETWEEN salgrade.losal AND salgrade.hisal 
AND emp.deptno = dept.deptno group by salgrade.grade, dept.dname, emp.ename 

當你group by salgrade.grade, dept.dname, emp.ename結果將被分爲這三個值。你也把結果BETWEEN salgrade.losal AND salgrade.hisal所以它會給那些在該時間間隔的工資全部employees。沒有限制任何東西,更大的人得到它?這就是爲什麼你有WARD 2 SALESMARTIN 2 SALES

0
SELECT SUB2.ENAME , SUB2.DNAME , S.GRADE ,SUB2.SAL 
FROM SALGRADE S, 
(SELECT E.ENAME,E.SAL,D.DNAME 
    FROM EMP E, DEPT D, 
     (SELECT DEPTNO, MAX(SAL) AS "MAX" 
      FROM EMP 
      GROUP BY DEPTNO) SUB1 
    WHERE E.SAL=SUB1.MAX 
    AND E.DEPTNO=D.DEPTNO) SUB2 

WHERE SUB2.SAL BETWEEN S.LOSAL AND S.HISAL 
-1

當我創造了這個我用這個格式,使其更易於閱讀和修改它是一個Oracle格式

CREATE TABLE EMP 
    (EMP_NO NUMBER(4) NOT NULL PRIMARY KEY, 
     E_NAME VARCHAR2(10), 
     JOB VARCHAR2(9), 
      MGR NUMBER(4), 
      HIRE_DATE DATE, 
       SAL DECIMAL(7, 2), 
       COMM DECIMAL(7, 2), 
        DEPT_NO NUMBER(2)); 

SELECT * 
FROM EMP 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES 
    (7369, 'SMITH', 'CLERK', 7902, '17-DEC-1980', 800, NULL, 20); 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES 
    (7499, 'ALLEN', 'SALESMAN', 7698, '20-FEB-1981', 1600, 300, 30); 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES 
    (7521, 'WARD', 'SALESMAN', 7698, '22-FEB-1981', 1250, 500, 30); 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES 
    (7566, 'JONES', 'MANAGER', 7839, '02-APR-1981', 2975, NULL, 20); 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES 
    (7654, 'MARTIN', 'SALESMAN', 7698, '28-SEP-1981', 1250, 1400, 30); 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES 
    (7698, 'BLAKE', 'MANAGER', 7839, '01-MAY-1981', 2850, NULL, 30); 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES 
    (7782, 'CLARK', 'MANAGER', 7839, '09-JUN-1981', 2450, NULL, 10); 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES 
    (7788, 'SCOTT', 'ANALYST', 7566, '09-DEC-1982', 3000, NULL, 20); 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES 
    (7839, 'KING', 'PRESIDENT', NULL, '17-NOV-1981', 5000, NULL, 10); 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES 
    (7844, 'TURNER', 'SALESMAN', 7698, '08-SEP-1981', 1500, 0, 30); 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES  
    (7876, 'ADAMS', 'CLERK', 7788, '12-JAN-1983', 1100, NULL, 20); 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES 
    (7900, 'JAMES', 'CLERK', 7698, '03-DEC-1981', 950, NULL, 30); 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES 
    (7902, 'FORD', 'ANALYST', 7566, '03-DEC-1981', 3000, NULL, 20); 

INSERT INTO EMP 
    (EMP_NO, E_NAME, JOB, MGR, HIRE_DATE, SAL, COMM, DEPT_NO) 
VALUES 
    (7934, 'MILLER', 'CLERK', 7782, '23-JAN-1982', 1300, NULL, 10); 

CREATE TABLE DEPT 
    (DEPT_NO NUMERIC(2), 
     D_NAME VARCHAR(14), 
     LOC VARCHAR(13)); 

INSERT INTO DEPT 
    (DEPT_NO, D_NAME, LOC) 
VALUES 
    (10, 'ACCOUNTING', 'NEW YORK'); 

INSERT INTO DEPT 
    (DEPT_NO, D_NAME, LOC) 
VALUES 
    (20, 'RESEARCH', 'DALLAS'); 

INSERT INTO DEPT 
    (DEPT_NO, D_NAME, LOC) 
VALUES 
    (30, 'SALES', 'CHICAGO'); 

INSERT INTO DEPT 
    (DEPT_NO, D_NAME, LOC) 
VALUES 
    (40, 'OPERATIONS', 'BOSTON'); 

CREATE TABLE BONUS 
    (E_NAME VARCHAR(10), 
     JOB VARCHAR(9), 
     SAL NUMERIC, 
      COMM NUMERIC); 

CREATE TABLE SAL_GRADE 
    (GRADE NUMERIC, 
     LO_SAL NUMERIC, 
     HI_SAL NUMERIC); 

INSERT INTO SAL_GRADE 
    (GRADE, LO_SAL, HI_SAL) 
VALUES 
    (1, 700, 1200); 

INSERT INTO SAL_GRADE 
    (GRADE, LO_SAL, HI_SAL) 
VALUES 
    (2, 1201, 1400); 

INSERT INTO SAL_GRADE 
    (GRADE, LO_SAL, HI_SAL) 
VALUES 
    (3, 1401, 2000); 

INSERT INTO SAL_GRADE 
    (GRADE, LO_SAL, HI_SAL) 
VALUES 
    (4, 2001, 3000); 

INSERT INTO SAL_GRADE 
    (GRADE, LO_SAL, HI_SAL) 
VALUES 
    (5, 3001, 9999); 
0

Screen Shot //////嘗試了這一點

SELECT E.EMPNO, E.ENAME, E.JOB, D.DNAME, E.SAL, E.DEPTNO, S.GRADE 
FROM EMP E, SALGRADE S, DEPT D 
WHERE E.SAL IN (SELECT MAX(SAL) FROM EMP GROUP BY DEPTNO) 
AND E.SAL BETWEEN S.LOSAL AND S.HISAL 
AND E.DEPTNO = D.DEPTNO 
ORDER BY E.SAL DESC