2014-03-27 62 views
0

我試圖創建一個視圖,其中包含每個分支中最新僱傭的員工的信息。但我沒有成功。任何人都可以指引我走向正確的道路。如何創建視圖

CREATE TABLE BRANCH(
    BRANCH_ID NUMBER(8) PRIMARY KEY, 
    BRANCH_NAME VARCHAR2(100) NOT NULL, 
    SCHEDULE_LINK_NUM NUMBER(8), 
    MAIN_BRANCH_ID number(8), 
    BRANCH_MGR_ID NUMBER(8), 
    BRANCH_OPEN_DATE DATE, 
    EMAIL VARCHAR2(50), 
    URL VARCHAR2(50) 
    ); 

    CREATE TABLE EMPLOYEE(
    EMPLOYEE_ID NUMBER(8) PRIMARY KEY, 
    FIRST_NAME VARCHAR2(50), 
    LAST_NAME VARCHAR2(50), 
    MIDDLE_NAME VARCHAR2(50), 
    GENDER CHAR(1), 
    SSN NUMBER(9) NOT NULL, 
    DOB DATE, 
    MARITAL_STATUS VARCHAR2(30), 
    SPOUSE_NAME VARCHAR2(50), 
    HOME_PHONE NUMBER(10), 
    CELL_PHONE NUMBER(10), 
    OFFICE_PH_EXTN NUMBER(6), 
    EMPLOYEE_TYPE VARCHAR2(40), 
    SALARY NUMBER(10,2), 
    TAX_DEDUCTION NUMBER(10,2), 
    BRANCH_ID NUMBER(8), 
    MGR_ID NUMBER(8), 
    CONSTRAINT EMP_BRANCH_FKEY FOREIGN KEY(BRANCH_ID) REFERENCES BRANCH(BRANCH_ID), 
    CONSTRAINT EMP_EMPTYPE_CHECK CHECK(EMPLOYEE_TYPE IN ('MANAGER', 'MECHANIC', 'SECRETARY', 'SALES PERSON')), 
    CONSTRAINT EMP_MARITSTATUS_CHECK CHECK(MARITAL_STATUS IN ('SINGLE', 'MARRIED', 'DIVORCED')) 
    ); 

    CREATE TABLE EMP_WORK_HISTORY(
    BRANCH_EMP_NUM NUMBER(8) PRIMARY KEY, 
    BRANCH_ID NUMBER(8), 
    EMPLOYEE_ID NUMBER(8), 
    JOIN_DATE DATE NOT NULL, 
    RELIEVING_DATE DATE, 
    EMPLOYEE_TYPE VARCHAR2(40), 
    DESCRIPTION VARCHAR2(200), 
    CONSTRAINT BRANCH_WRKHIS_BID_FKEY FOREIGN KEY(BRANCH_ID) REFERENCES BRANCH(BRANCH_ID), 
    CONSTRAINT BRANCH_WRKHIS_EID_FKEY FOREIGN KEY(EMPLOYEE_ID) REFERENCES EMPLOYEE(EMPLOYEE_ID), 
    CONSTRAINT EMP_WRKHIS_EMPTYPE_CHECK CHECK(EMPLOYEE_TYPE IN ('MANAGER', 'MECHANIC', 'SECRETARY', 'SALES PERSON')) 
    ); 

我寫的觀點象下面這樣:

CREATE VIEW LAST_EMPLOYEE_BRANCH AS 
WITH LAST_EMP_BRANCH AS 
(SELECT MAX(EWH.JOIN_DATE) AS LAST_HIRED_DATE, EWH.BRANCH_ID 
FROM EMP_WORK_HISTORY EWH GROUP BY EWH.BRANCH_ID) 
SELECT E.FIRST_NAME || E.LAST_NAME AS EMPLOYEE_NAME, 
B.BRANCH_NAME, LEB.LAST_HIRED_DATE, E.SALARY, 
EXTRACT(YEAR FROM NUMTOYMINTERVAL(MONTHS_BETWEEN(TRUNC(SYSDATE),E.DOB),'MONTH')) AS AGE 
FROM EMPLOYEE E, BRANCH B, LAST_EMP_BRANCH LEB 
WHERE E.BRANCH_ID = B.BRANCH_ID 
AND LEB.BRANCH_ID = E.BRANCH_ID; 

通過運行上述觀點我得到所有員工的記錄。任何人都可以幫忙嗎?

+4

「_i正在獲取所有員工記錄_」 - 並且您期望得到什麼? – mustaccio

回答

0

看起來您忘記了在連接中包含EMP_WORK_HISTORY表和LAST_HIRED_DATE列。請嘗試以下查詢:

CREATE OR REPLACE VIEW LAST_EMPLOYEE_BRANCH AS 
WITH LAST_EMP_BRANCH AS 
(SELECT MAX(EWH.JOIN_DATE) AS LAST_HIRED_DATE, EWH.BRANCH_ID 
FROM EMP_WORK_HISTORY EWH GROUP BY EWH.BRANCH_ID) 
SELECT E.FIRST_NAME || E.LAST_NAME AS EMPLOYEE_NAME, 
B.BRANCH_NAME, LEB.LAST_HIRED_DATE, E.SALARY, 
EXTRACT(YEAR FROM NUMTOYMINTERVAL(MONTHS_BETWEEN(TRUNC(SYSDATE),E.DOB),'MONTH')) AS AGE 
FROM EMPLOYEE E, BRANCH B, LAST_EMP_BRANCH LEB, EMP_WORK_HISTORY EWH 
WHERE E.BRANCH_ID = B.BRANCH_ID 
AND LEB.BRANCH_ID = E.BRANCH_ID 
AND E.EMPLOYEE_ID = EWH.EMPLOYEE_ID 
AND B.BRANCH_ID = EWH.BRANCH_ID 
AND LEB.LAST_HIRED_DATE = EWH.JOIN_DATE;