2017-03-06 40 views
-1

這裏是我的解決方案,我想顯示所有的信息在3個表中的薪水,當我把薪水放在最後,不管我嘗試了什麼,我仍然錯了。有人幫我修復。我不知道如何顯示只有15行的工資。ORA-00904:在這種情況下無效的標識

SELECT Bld.id,C.code,M.FIRST_NAME,M.LAST_NAME,Bld.Address,M.ADDRESS,D.DOB,S.SALARY 
    from HW1_PERSON M 
    inner join HW1_BUILDING Bld 
    ON M.id = Bld.id 
    INNER JOIN HW1_PERSON M 
    ON Bld.id = M.id 
    INNER JOIN HW1_PERSON M 
    ON M.id = Bld.id 
    Inner JOIN HW1_BUILDING Bld 
    ON Bld.id = M.id 
    INNER JOIN HW1_BUILDING C 
    ON M.id = C.id 
    INNER JOIN HW1_PERSON D 
    ON M.id = D.id 
    UNION ALL 
    SELECT Bld.id,C.code,M.FIRST_NAME,M.LAST_NAME,Bld.Address,M.ADDRESS,D.DOB,S.SALARY FROM HW1_STAFF S 
    where S.SALARY = NULL 
    ; 

下面是表

CREATE TABLE HW1_PERSON (
    ID INT NOT NULL, 
    FIRST_NAME VARCHAR(32) NOT NULL, 
    LAST_NAME VARCHAR(32) NOT NULL, 
    DOB DATE, 
    ADDRESS VARCHAR2(32), 
    CONSTRAINT PK_HW1_PERSON_ID PRIMARY KEY (ID)); 

CREATE TABLE HW1_STAFF (
    SALARY DOUBLE PRECISION NOT NULL, 
    START_DATE DATE NOT NULL, 
    END_DATE DATE DEFAULT NULL, 
    EMP_NUM VARCHAR(5) NOT NULL UNIQUE, 
    PERSON_ID INT NOT NULL, 
    CONSTRAINT PK_HW1_STAFF PRIMARY KEY (PERSON_ID), 
    CONSTRAINT FK_STAFF_PERSON FOREIGN KEY(PERSON_ID) REFERENCES HW1_PERSON(ID)); 

CREATE TABLE HW1_BUILDING (
    ID INT NOT NULL, 
    CODE VARCHAR2(5) NOT NULL UNIQUE, 
    NAME VARCHAR2(32) NOT NULL, 
    ADDRESS VARCHAR2(32), 
    MANAGER_ID INT, 
    CONSTRAINT PK_HW1_BUILDING PRIMARY KEY (ID), 
    CONSTRAINT FK_BUILDING_STAFF FOREIGN KEY(MANAGER_ID) REFERENCES HW1_STAFF(PERSON_ID)); 

CREATE TABLE HW1_EMPLOYEE (
    ID INT NOT NULL, 
    PERSON_ID INT, 
    BUILDING_ID INT, 
    CONSTRAINT PK_HW1_EMPLOYEE PRIMARY KEY (PERSON_ID,BUILDING_ID), 
    CONSTRAINT FK_STAFF_ID FOREIGN KEY(PERSON_ID) REFERENCES HW1_STAFF(PERSON_ID), 
    CONSTRAINT FK_BUILDING_ID FOREIGN KEY(BUILDING_ID) REFERENCES HW1_BUILDING(ID)); 

資料實例

INSERT INTO hw1_person (id, first_name, last_name, dob, address) VALUES (1, 'fname11', 'lname11', to_date('7/27/1990', 'MM/DD/YYYY'), '527 15th Av CT'); 
INSERT INTO hw1_person (id, first_name, last_name, dob, address) VALUES (2, 'fname12', 'lname12', to_date('12/5/1966', 'MM/DD/YYYY'), '254 11th St CT'); 


INSERT INTO hw1_staff (person_id, emp_num, start_date, end_date, salary) VALUES (1, 'WZIAE', to_date('7/1/1965', 'MM/DD/YYYY'), null,70000); 
INSERT INTO hw1_staff (person_id, emp_num, start_date, end_date, salary) VALUES (2, 'EWEMU', to_date('11/18/1980', 'MM/DD/YYYY'), to_date('12/26/1970', 'MM/DD/YYYY'),80000); 
INSERT INTO hw1_staff (person_id, emp_num, start_date, end_date, salary) VALUES (25, '00001', to_date('5/21/1994', 'MM/DD/YYYY'), null,0); 
INSERT INTO hw1_staff (person_id, emp_num, start_date, end_date, salary) VALUES (26, '00002', to_date('7/19/1985', 'MM/DD/YYYY'), null,0); 
+0

。在你的第一選擇之前'UNION'沒有'S'別名。你需要在你的M,Bld,C或D表中找到相應的工資,或者加入HW1_STAFF到第一個選擇 – cha

+0

你能告訴我嗎?PLS – kkfjjjg

+0

如果你想要人們幫助你,你需要設計一個體面的問題。您的示例數據不包括查詢中的所有表格,並且您發佈的一些記錄不符合您的完整性約束條件。此外,您還需要解釋您希望執行查詢的業務邏輯,而不是期望我們從您的shonky代碼中推斷出規則。 – APC

回答

0
SELECT Bld.id,C.code,M.FIRST_NAME,M.LAST_NAME,Bld.Address,M.ADDRESS,D.DOB, '0' AS S.SALARY 
    from HW1_PERSON M 
    inner join HW1_BUILDING Bld 
    ON M.id = Bld.id 
    INNER JOIN HW1_PERSON M 
    ON Bld.id = M.id 
    INNER JOIN HW1_PERSON M 
    ON M.id = Bld.id 
    Inner JOIN HW1_BUILDING Bld 
    ON Bld.id = M.id 
    INNER JOIN HW1_BUILDING C 
    ON M.id = C.id 
    INNER JOIN HW1_PERSON D 
    ON M.id = D.id 
    UNION ALL 
    SELECT Bld.id,C.code,M.FIRST_NAME,M.LAST_NAME,Bld.Address,M.ADDRESS,D.DOB,S.SALARY FROM HW1_STAFF S 
    where S.SALARY = NULL 
    ; 

我第一個查詢列是不存在的S.SALARY因此設置默認爲'0'或''

+0

不工作。第1行的ERROR: ORA-00923:未找到FROM關鍵字 – kkfjjjg

+0

爲什麼您有以下系列的連接:INNER JOIN HW1_PERSON M ON Bld.id = M.id INNER JOIN HW1_PERSON M ON M.id = Bld。編號 – BobC

+0

這對於bulid id – kkfjjjg

0

首先,您在這裏做了一些不必要的連接。

你寫

from HW1_PERSON M 
inner join HW1_BUILDING Bld 
ON M.id = Bld.id 
INNER JOIN HW1_PERSON M 
ON Bld.id = M.id 
INNER JOIN HW1_PERSON M 
ON M.id = Bld.id 
Inner JOIN HW1_BUILDING Bld 
ON Bld.id = M.id 
INNER JOIN HW1_BUILDING C 
ON M.id = C.id 
INNER JOIN HW1_PERSON D 
ON M.id = D.id 

,但如果你這樣寫的,那麼這將是足夠

from HW1_PERSON M 
inner join HW1_BUILDING Bld 
ON M.id = Bld.id 
INNER JOIN HW1_BUILDING C 
ON M.id = C.id 

而且,你都用了MD作爲同桌HW1_PERSON的別名 - 這在執行查詢時導致錯誤

其次,如評論中所述,您的第一個查詢不包含S.SALARYHW1_STAFF列。從你的表格結構來看,我認爲你可以在你的第一個查詢中這樣做。

SELECT Bld.id,C.code,M.FIRST_NAME,M.LAST_NAME,Bld.Address,M.ADDRESS,M.DOB,S.SALARY 
from HW1_PERSON M 
inner join HW1_BUILDING Bld 
ON M.id = Bld.id 
INNER JOIN HW1_BUILDING C 
ON M.id = C.id 
INNER JOIN HW1_STAFF S 
ON S.PERSON_ID = M.id 

而且,在你的第二個查詢,您在S.SALARY搜索NULL,但你HW1_STAFF表的定義,該列將不能爲空。所以,在第二個查詢中,你不會得到任何結果。也許你應該該查詢改變 - 以這樣的

SELECT Bld.id,C.code,M.FIRST_NAME,M.LAST_NAME,Bld.Address,M.ADDRESS,D.DOB,S.SALARY FROM HW1_STAFF S 
where S.END_DATE = NULL 

然後,整個查詢會是這個樣子

SELECT Bld.id,C.code,M.FIRST_NAME,M.LAST_NAME,Bld.Address,M.ADDRESS,M.DOB,S.SALARY 
from HW1_PERSON M 
inner join HW1_BUILDING Bld 
ON M.id = Bld.id 
INNER JOIN HW1_BUILDING C 
ON M.id = C.id 
INNER JOIN HW1_STAFF S 
ON S.PERSON_ID = M.id 
UNION ALL 
SELECT Bld.id,C.code,M.FIRST_NAME,M.LAST_NAME,Bld.Address,M.ADDRESS,M.DOB,S.SALARY FROM HW1_STAFF S 
where S.END_DATE = NULL 
; 
+0

如何存在第一個查詢的部分,因爲它顯示FROM錯誤,我應該更改顯示工資? – kkfjjjg

+0

你會寫任何你在第一個查詢的'from'中寫的東西;那麼你會寫我寫的內部連接部分;那麼你將與第二個查詢結合。 – Muntasir

+0

在你的第二個查詢中,你可以執行'where S.END_DATE = NULL';那麼我認爲你可以在第二個查詢中得到一些結果。 – Muntasir