Sql 返回ID';标准普尔;所有同时学习英语101和英语102的学生的名字和姓氏(2列11行)
我已经使用别名创建了两个表实例,但是当我搜索一个和另一个班级的学生时,我的查询不会返回任何结果Sql 返回ID';标准普尔;所有同时学习英语101和英语102的学生的名字和姓氏(2列11行),sql,sql-server,tsql,join,Sql,Sql Server,Tsql,Join,我已经使用别名创建了两个表实例,但是当我搜索一个和另一个班级的学生时,我的查询不会返回任何结果 select s01.StudentID, s01.StudFirstName, s01.StudLastName from Students s01 join Student_Schedules as ss01 on s01.StudentID = ss01.StudentID join Classes as c01 on ss01.ClassID = c01.ClassID
select s01.StudentID, s01.StudFirstName, s01.StudLastName
from Students s01
join Student_Schedules as ss01
on s01.StudentID = ss01.StudentID
join Classes as c01
on ss01.ClassID = c01.ClassID
join Subjects as sbj01
on c01.SubjectID = sbj01.SubjectID
--rejoins
join Students as s02
on s01.StudentID = s02.StudentID
join Student_Schedules as ss02
on ss01.StudentID = ss02.StudentID
join Classes as c02
on c01.ClassID = c02.ClassID
join Subjects as sbj02
on sbj01.SubjectID = sbj02.SubjectID
where sbj01.SubjectCode like 'ENG 101'
and sbj02.SubjectCode like 'ENG 102';
我想这就是你的意思:
select s.StudentID, s.StudFirstName, s.StudLastName
from Students s
join Student_Schedules as ss01 on s.StudentID = ss01.StudentID
join Classes as c01 on ss01.ClassID = c01.ClassID
join Subjects as sbj01 on c01.SubjectID = sbj01.SubjectID
join Student_Schedules as ss02 on s.StudentID = ss02.StudentID
join Classes as c02 on ss02.ClassID = c02.ClassID
join Subjects as sbj02 on c02.SubjectID = sbj02.SubjectID
where sbj01.SubjectCode = 'ENG 101' and sbj02.SubjectCode = 'ENG 102';
说明:
- 您的查询试图查找同时参加了
和'ENG 101'
课程的学生;为此,您将遵循两种不同的路径('ENG 102'
)Student>Student\u Schedule>Subjects
- 但是您正在使用连接条件,例如
,这会强制两个路径相同;因此,您实际上最终要查找一个ss01.StudentID=ss02.StudentID
,其代码既为主题
又为'ENG 101'
,这是不可能的'ENG 102'
- 你不需要带学生来两次
相当于像'ENG 101'
='ENG 101'
这是性能杀手。
使用
having
子句中的条件进行过滤和聚合,而不是所有这些双连接:
select s.StudentID, s.StudFirstName, s.StudLastName
from Students s
join Student_Schedules as ss on s.StudentID = ss.StudentID
join Classes as c on ss.ClassID = c.ClassID
join Subjects as sbj on c.SubjectID = sbj.SubjectID
where sbj.SubjectCode in ('ENG 101', 'ENG 102')
group by s.StudentID, s.StudFirstName, s.StudLastName
having count(distinct sbj.SubjectCode) = 2
我相信如果没有重复项,
count()
中实际上不需要distinct
。我个人会使用exists
重新安排逻辑,因为这是我脑海中的想法
- 为了清晰起见,我会使用完整的连接名称,
内部连接
- 我将使用模式名完全限定表名,例如
dbo
- 我将使用
而不是像=
那样使用
,因为您没有执行通配符搜索
谢谢你的帮助。你是对的。创建大量联接是没有意义的。谢谢你给我展示了一个更有效的选择。这不是一个选择。你的方法在任何方面都是低效的。
select s01.StudentID, s01.StudFirstName, s01.StudLastName
from dbo.Students s01
where exists (
select 1
from dbo.Student_Schedules as ss01
inner join dbo.Classes as c01 on ss01.ClassID = c01.ClassID
inner join dbo.Subjects as sbj01 on c01.SubjectID = sbj01.SubjectID
where s01.StudendID = ss01.StudendID
and sbj01.SubjectCode = 'ENG 101'
)
and exists (
select 1
from dbo.Student_Schedules as ss02
inner join dbo.Classes as c02 on ss02.ClassID = c02.ClassID
inner join dbo.Subjects as sbj02 on c02.SubjectID = sbj02.SubjectID
where s01.StudendID = ss02.StudendID
and sbj02.SubjectCode = 'ENG 102'
)