2013-12-18 4 views
0

я в настоящее время учится на финал, и один из исследуемых вопросов от предыдущего экзамена заключается в следующем:SQL набор разделение

У вас есть следующая схема:
Student (Snum: целое число, Sname: строка, Major: строка, Class: строка, Age: строка)
курс (Cname: строка, Meets_at: время, Room: строка, Fid: Integer)
факультет (Fid: Integer, 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

Я считаю, что «*, где некоторый класс соответствует *» означает, что должно быть по крайней мере один студент поступил в таком классе, так что вам нужно будет использовать '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; 
Смежные вопросы