2013-04-10 134 views
1

這裏的Oracle SQL檢索數據的關係:跨越3個表

CREATE TABLE employee (
    name varchar2(15) not null, 
    ssn  char(9), 
    primary key (ssn), 
    foreign key (superssn) references employee(ssn), 
); 

CREATE TABLE project (
    pname  varchar2(15) not null, 
    pnumber number(4), 
    primary key (pnumber), 
    unique (pname), 
); 

CREATE TABLE works_on (
    essn char(9), 
    pno number(4), 
    primary key (essn,pno), 
    foreign key (essn) references employee(ssn), 
    foreign key (pno) references project(pnumber) 
); 

問:誰檢索每個項目工作的所有員工的姓名。

我想我被要求查詢所有參與項目的員工,按項目名稱排序。任何想法如何解決這個問題?

回答

1

這是一個經典divide問題。

試試這個。

SELECT name FROM Employee 
    WHERE NOT EXISTS (SELECT pnumber FROM project WHERE pnumber 
     NOT IN (SELECT pno from Works_on WHERE employee.ssn = works_on.essn)) 

或所有項目和自己的員工,

SELECT employees.name, project.pname FROM employees 
    INNER JOIN works_on ON employees.ssn = works_on.essn 
     INNER JOIN project ON works_on.pno = project.pnumber; 
+0

嗨蘇格蘭威士忌,這返回了一些東西,但只有1個名字。 – maxspiderx 2013-04-11 02:02:13

+0

那麼只有一個人參與所有項目?這就是你的描述所說的那樣。你想要在每個項目上工作的員工姓名。你是否想要所有項目的EmployeeName和ProjectName? – Scotch 2013-04-11 02:42:55

+0

是的,我認爲這是要求提供所有項目及其各自員工的名單。 – maxspiderx 2013-04-11 03:04:32

0
SELECT E.NAME FROM 
EMPLOYEE E, 
PROJECT P, 
WORKS_ON WO 
WHERE 
E.SSN = WO.ESSN 
AND WO.PNO = P.PNUMBER 
ORDER BY P.PNAME; 

檢查是否適用於您。

你可以試試這個太:

SELECT E.NAME FROM 
(SELECT E.NAME, P.PNAME FROM 
    EMPLOYEE E, 
    PROJECT P, 
    WORKS_ON WO 
    WHERE 
    E.SSN = WO.ESSN 
    AND WO.PNO = P.PNUMBER 
    ORDER BY P.PNAME); 
+0

謝謝,我會嘗試今晚。 但是,假設我想通過pnumber而不是pname對此進行排序,但不希望pnumber列顯示在我的查詢中,我該怎麼做?我原本與你有相同的答案,除了我有: order by p.pnumber 並且產生了一個錯誤。 – maxspiderx 2013-04-10 19:49:56

+0

你可以像上面那樣完成。在這裏粘貼錯誤日誌。 – Jeyvison 2013-04-10 20:19:59

+0

剛編輯我的答案,檢查出來。 – Jeyvison 2013-04-10 20:29:34