以下是我的表格和插入值:
create table student (
LastName varchar(40),
FirstName varchar(40),
SID number(5),
SSN number(9),
Career varchar(4),
Program varchar(10),
City varchar(40),
Started number(4),
primary key (SID),
unique(SSN)
);
create table enrolled (
StudentID number(5),
CourseID number(4),
Quarter varchar(6),
Year number(4),
primary key (StudentID, CourseID),
foreign key (StudentID) references student(SID),
foreign key (CourseID) references course(CID)
);
insert into student
values ( 'Brennigan', 'Marcus', 90421, 987654321, 'UGRD', 'COMP-GPH', 'Evanston', 2001 );
insert into student
values ( 'Patel', 'Deepa', 14662, null, 'GRD', 'COMP-SCI', 'Evanston', 2003 );
insert into student
values ( 'Snowdon', 'Jonathan', 08871, 123123123, 'GRD', 'INFO-SYS', 'Springfield', 2005 );
insert into student
values ( 'Starck', 'Jason', 19992, 789789789, 'UGRD', 'INFO-SYS', 'Springfield', 2003 );
insert into student
values ( 'Johnson', 'Peter', 32105, 123456789, 'UGRD', 'COMP-SCI', 'Chicago', 2004 );
insert into student
values ( 'Winter', 'Abigail', 11035, 111111111, 'GRD', 'PHD', 'Chicago', 2003 );
insert into student
values ( 'Patel', 'Prakash', 75234, null, 'UGRD', 'COMP-SCI', 'Chicago', 2001 );
insert into student
values ( 'Snowdon', 'Jennifer', 93321, 321321321, 'GRD', 'COMP-SCI', 'Springfield', 2004 );
insert into enrolled
values (11035, 1020, 'Fall', 2005);
insert into enrolled
values (11035, 1092, 'Fall', 2005);
insert into enrolled
values (11035, 8772, 'Spring', 2006);
insert into enrolled
values (75234, 3201, 'Winter', 2006);
insert into enrolled
values (08871, 1092, 'Fall', 2005);
insert into enrolled
values (90421, 8772, 'Spring', 2006);
insert into enrolled
values (90421, 2987, 'Spring', 2006);
我有以下查询:
SELECT e.studentid
FROM enrolled e
FULL OUTER JOIN student s ON e.studentid = s.sid
WHERE ((e.quarter = 'Fall') OR (e.quarter = 'Spring'))
GROUP BY e.studentid
HAVING count(e.studentid) = 1;
但这只会返回
8871
这应该返回
8871
90421
此查询的目标是:列出在秋季季度至少注册一门课程或在春季开设至少一门课程的学生,但不是两者。您将不得不添加几行来测试您的查询。
任何帮助将不胜感激。感谢。
答案 0 :(得分:3)
尝试一下,
SELECT a.SID
FROM student a
INNER JOIN enrolled b
ON a.SID = b.StudentID
WHERE b.quarter IN ('Fall', 'Spring')
GROUP BY a.SID
HAVING COUNT(DISTINCT b.quarter) = 1
答案 1 :(得分:2)
SELECT e.studentid
FROM enrolled e
WHERE e.quarter IN ('Spring', 'Fall')
GROUP BY
e.studentid
HAVING COUNT(DISTINCT quarter) = 1;
90421
在春季注册了两门不同的课程,这就是为什么原始查询会将其计算两次。
你需要计算季节,而不是入学。
答案 2 :(得分:0)
学生ID有两个记录 - 90421因此计数将返回2