我目前正在为期末考试做准备,之前考试的学习问题之一如下:
您具有以下架构:
学生( 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);
我认为我走在正确的轨道上,但我不确定这是否正确。 任何帮助将不胜感激!
是的,我认为您将每位教职员工的数量与课程桌上不同房间的数量相匹配的策略是正确的。
请尝试以下查询:
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 符合标准 - 在所有三个教室教学 - A、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;