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'

如果你想让所有修过3门或3门以上课程的学生都参加,你会使用三重连接(或更多)?
这是性能杀手。
使用
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'
    )