2013-12-18 44 views
0

我目前正在作最後的研究,並從以前的考試研究的問題之一是:SQL設定的分割

您有以下模式:
學生Snum:整數,Sname:串,Major:串,Class:串,Age:字符串)
Cname:字符串,Meets_at:時間,Room:串,Fid:整數)
學部Fid:整數,Fname:串,Deptid:整數)
已登記Snum:整數,Cname:整數)

我有問題的問題是:

「找到所有教職員的名字,在每個房間裏教導 部分課程」

這是我到目前爲止有:

SELECT DISTINCT(Fname) 
FROM (FACULTY NATURAL JOIN COURSE AS C1), COURSE AS C2 
WHERE C1.Room = C2.Room 
GROUP BY Fname,C2.Cname 
WHERE COUNT(C1.Room) = (SELECT COUNT(DISTINCT(Room)) 
         FROM COURSE 
         WHERE Cname = C2.Cname); 

我覺得我在正確的軌道上,但我不知道這是正確的。任何幫助,將不勝感激!

+0

我相信「*其中一些類符合*」意味着應該有至少1名學生就讀於這樣的類,所以你需要使用'Enrolled'表也是如此。 –

+0

我不確定是否有必要;這個模式總共有6個問題,並不是所有其他問題都使用所有的表。 –

+0

你可能是對的。 –

回答

1

是的我認爲你正處於正確的軌道上,將每位教員的人數與課程表上不同房間的人數相匹配。

嘗試以下查詢:

SELECT DISTINCT F.Fname 
FROM 
Faculty AS F 
INNER JOIN 
    (SELECT Fid, COUNT(DISTINCT Room) AS cnt FROM Course 
    GROUP BY Fid 
    ) rooms_per_faculty 
    ON F.Fid = rooms_per_faculty.Fid 
INNER JOIN 
    (SELECT COUNT(DISTINCT Room) AS cnt FROM Course) rooms_that_meet 
    ON rooms_per_faculty.cnt = rooms_that_meet.cnt 

(可能有助於有一個小的數據與玩弄在下面的例子中,只有DR.4符合標準 - 教學在所有三個房間課程 - 一個,B,C)

create local temporary table course(Room varchar(1), Fid int); 
create local temporary table faculty(Fid int, Fname varchar(3)); 
insert into faculty 
    select 1, 'DR1' 
union select 2, 'DR2' 
union select 3, 'DR3' 
union select 4, 'DR4'; 

insert into course 
    select 'A',1 
union select 'B',1 
union select 'A',2 
union select 'C',3 
union select 'B',4 
union select 'A',4 
union select 'C',4;