【问题标题】:SQL query exists allSQL查询全部存在
【发布时间】:2021-03-07 12:18:19
【问题描述】:

我需要一个查询来使用下表列出参加所有可用课程的学生。

declare @Course table (CourseID nvarchar(4))
declare @CourseStudent table 
                       (
                           CourseID nvarchar(4),
                           Student nvarchar(50)
                       )

insert into @Course values ('SOS1')
insert into @Course values ('MAT3')
insert into @Course values ('FEN2')

insert into @CourseStudent values ('MAT3', 'Mehmet')
insert into @CourseStudent values ('SOS1', 'Ahmet')
insert into @CourseStudent values ('MAT3', 'Ahmet')
insert into @CourseStudent values ('FEN2', 'Ahmet')
insert into @CourseStudent values ('SOS1', 'Ali')
insert into @CourseStudent values ('FEN2', 'Ayse')

select * from @Course

select * from @CourseStudent

【问题讨论】:

  • 到目前为止你得到了什么?是否有学生参加了所有这些课程以及其他课程?
  • 有了正确的主键,您需要做的就是计算 CourseStudent 中的行数。您是否有一个或是否有可能一个学生可能会多次“参加”同一门课程?
  • 不,不可能多次学习同一门课程。
  • 我想在课程表中列出参加过所有课程的学生。
  • 有关使用 EXISTS 的解决方案,请参阅:stackoverflow.com/questions/53342896/…

标签: sql-server exists


【解决方案1】:

您可以嵌套一些 not exists 查询。下面的解决方案翻译如下:

  1. 选择所有独特的学生...
  2. 没有课程的地方......
  3. 该学生不存在。

解决方案

select distinct cs.Student
from @CourseStudent cs
where not exists ( select 'x'
                   from @Course c
                   where not exists ( select 'x'
                                      from @CourseStudent cs2
                                      where cs2.CourseID = c.CourseID
                                        and cs2.Student = cs.Student ) )

Fiddle 了解实际情况。

【讨论】:

    【解决方案2】:

    这是一个关系划分问题。有很多方法可以解决它。本例中最简单的使用COUNT

    SELECT cs.Student
    FROM @CourseStudent cs
    GROUP BY cs.Student
    HAVING COUNT(*) = (SELECT COUNT(*) FROM @Course);
    

    这不涉及学生学习不在@Course的课程的情况

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多