我必须找到在课程和其他课程中注册的学生姓名。但是,当我执行WHERE语句时,它会删除所有其他具有其他类的行。
所以我的问题是:我该怎样做才能比较整个小组,只选择CLASSA和CLASSB的学生。
有些学生在CLASSA学习,有些学生在CLASSB学习,有些学生在CLASSB学习。如何获得两者中的那个?
例如:
如果我使用OR,它将选择所有名称。但我只想要一个同时上课的学生。所以Timmy Edwards是我想要的人。
WHERE C.DESCRIPTION LIKE 'Systems Analysis%'
AND C.DESCRIPTION LIKE'项目管理%'
答案 0 :(得分:1)
您可以使用group by
和having
:
select student
from enrollments
where class in ('CLASSA', 'CLASSB')
group by student
having count(*) = 2;
此版本假定学生只能为特定课程注册一次。
答案 1 :(得分:0)
每个类都没有单独的行。这意味着,AND
和OR
在您使用它们时毫无用处。您需要使用EXISTS
关键字检查是否存在此类行。
select distinct
student
from
enrollments
where
exists (
select
1
from
enrollments e1
where
e1.student = enrollments.student
and e1.class = 'CLASSA'
) and exists (
select
1
from
enrollments e2
where
e2.student = enrollments.student
and e2.class = 'CLASSB'
)
注意:强>
每行都会包含学生姓名,因此我添加了DISTINCT
关键字以删除重复项。
答案 2 :(得分:0)
你可以尝试这样的事情,(虽然我不确定你的架构究竟是什么样的......)
WITH a AS
(
SELECT
S.FIRST_NAME||' '||S.LAST_NAME [Student]
,C.DESCRIPTION
FROM STUDENT S
JOIN ENROLLMENT E ON (E.STUDENT_ID = S.STUDENT_ID)
JOIN SECTION SE ON (SE.SECTION_ID = E.SECTION_ID)
JOIN COURSE C ON (C.COURSE_NO = SE.COURSE_NO)
WHERE C.DESCRIPTION = 'CourseA'
)
,b AS
(
SELECT
S.FIRST_NAME||' '||S.LAST_NAME [Student]
,C.DESCRIPTION
FROM STUDENT S
JOIN ENROLLMENT E ON (E.STUDENT_ID = S.STUDENT_ID)
JOIN SECTION SE ON (SE.SECTION_ID = E.SECTION_ID)
JOIN COURSE C ON (C.COURSE_NO = SE.COURSE_NO)
WHERE C.DESCRIPTION = 'CourseB'
)
Select a.Student, a.Description [DescA], b.Description [DescB]
from a join b on a.Student = b.Student
--optional where to just get students in both classes...
where a.Description is not null and b.Description is not null
希望这有助于......
答案 3 :(得分:0)
您总是可以尝试将SELECT结果与自身结合然后从该结果中选择的巧妙技巧。
SELECT A.NAME
FROM (SELECT S.FIRST_NAME||' '||S.LAST_NAME as NAME,
S.STUDENT_ID as S_ID,
C.DESCRIPTION as DESC
FROM STUDENT S
JOIN ENROLLMENT E ON (E.STUDENT_ID = S.STUDENT_ID)
JOIN SECTION SE ON (SE.SECTION_ID = E.SECTION_ID)
JOIN COURSE C ON (C.COURSE_NO = SE.COURSE_NO)) A
JOIN (S.STUDENT_ID as S_ID, C.DESCRIPTION as DESC
FROM STUDENT S
JOIN ENROLLMENT E ON (E.STUDENT_ID = S.STUDENT_ID)
JOIN SECTION SE ON (SE.SECTION_ID = E.SECTION_ID)
JOIN COURSE C ON (C.COURSE_NO = SE.COURSE_NO)) B
ON A.S_ID = B.S_ID
WHERE A.DESC LIKE 'Systems Analysis%'
AND B.DESC LIKE 'Project Management%'
GROUP BY A.NAME