繁体   English   中英

如何检查所有师范生是否都符合要求

[英]How to check if all of a Teachers students have met a requirement

我必须为每位老师做以下事情。

给定一个TeacherId,我想选择所有拥有该老师并已通过第一学期的学生。 如果所有老师都通过了考试,我想调用另一个存储过程:

EXEC AllTeachersStudentsPassedSemester1 @teacherId

下表如下:

老师-TeacherId

Students
 -userId
 -teacherId

CourseSummarry
 -userId
 -passedSemester1 (bool)

因此,要获得给定老师的所有用户,我需要:

SELECT userId
FROM Students
WHERE teacherId = @teacherId

如何测试列表中的所有学生是否都通过了Semester1 = TRUE,然后为该老师调用了proc AllTeachersStudentsPassedSemester1 困惑如何检查所有学生是否都通过了考试。

然后,我必须以某种方式遍历所有老师才能做到这一点。

似乎我必须用代码而不是sql对此进行编程。

如果我没有理解你的问题,你可以使用join具有聚合得到教师的名单。 然后,您将需要使用cursor调用传入每个教师ID的单独存储过程。 这是获取教师的sql

select s.teacherid
from students s 
    join coursesummary cs on s.userid = cs.userid
group by s.teacherid
having count(*) = sum(case when cs.passedSemester1 = 'true' then 1 else 0 end)

假定每个student记录都存在于coursesummary 如果不是的话,你需要使用一个outer join ,改变having标准略有下降。

附带说明一下,您的桌子设计似乎有些不对劲。 我认为您需要一个课程表和一个不同的交叉引用查找表。 我不会假定您会理解您的数据库。

此查询应为您提供所有没有失败学生的老师:

Select  Distinct S.TeacherId
From    Students            S
Where Not Exists
(
    Select  *
    From    CourseSummary   C
    Where   C.UserId In
    (
        Select  S2.UserId
        From    Students    S2
        Where   S2.TeacherId = S.TeacherId
    )
    And     C.passedSemester1 = 0
)

然后,您可以在CURSOR使用它来遍历每个条目以执行该过程:

Declare @TeacherId Int

Declare cur Cursor For
Select  Distinct S.TeacherId
From    Students            S
Where Not Exists
(
    Select  *
    From    CourseSummary   C
    Where   C.UserId In
    (
        Select  S2.UserId
        From    Students    S2
        Where   S2.TeacherId = S.TeacherId
    )
    And     C.passedSemester1 = 0
)

Open cur

While (1 = 1)
Begin
    Fetch Next From cur Into @TeacherId

    If @@Fetch_Status <> 0 Break

    Execute AllTeachersStudentsPassedSemester1 @TeacherId 
End

Close cur
Deallocate cur

这是您的查询,用于获取与给定老师一起通过了学期的所有学生:

SELECT S.userId
FROM Students S, CourseSummarry CS
WHERE CS.passedSemester1 = true
AND CS.userId = S.userId
AND S.teacherId = @teacherId

我通过“ ...检查所有学生是否都通过”来解决您的问题,而不是为您的问题提供完整的解决方案。

当选择学生时,请使用以下SQL(语法上不正确,但您会明白的):

select userId
from Students join Teacher
  on Students.teacherId = Teacher.teacherId
  and teacherId = @teacherId
  join CourseSummary
  on Students.userId = CourseSummary.userid
  and CourseSummary.passedSemester1 = true;

高温超导

   SELECT teacherId 
     FROM Students
     JOIN CourseSummarry 
       on CourseSummarry.userId = Students.userId
      and passedSemester1 = 'true' 
 except 
   SELECT teacherId 
     FROM Students
     JOIN CourseSummarry 
       on CourseSummarry.userId = Students.userId
      and passedSemester1 = 'false' 

与其检查是否所有学生都合格,不如检查是否所有学生都没有失败:检查所有学生是否都通过了,您需要知道有多少学生和多少通过了,检查是否没有一个学生只需要知道有多少失败了。

Select failed = Sum(Cast(passedSemester1 AS Int))
From   CourseSummarry cs
       INNER JOIN Students st ON cs.userId = st.userId
WHERE  @teacherId

由于SUM不能用于布尔值,因此您首先需要将其转换为另一种类型,在这种情况下为整数。

现在,如果failed为0,我们需要执行其他存储过程,为此,我们可以将failed转换为变量,并使用if检查它

Declare @failed int

Select @failed = Sum(Cast(passedSemester1 AS Int))
From   CourseSummarry cs
       INNER JOIN Students st ON cs.userId = st.userId
WHERE  @teacherId

If @failed = 0 Then
  EXEC AllTeachersStudentsPassedSemester1 @teacherId
End If

最后一步是将所有内容封装在存储过程定义中

CREATE Procedure myProc @teacherId
AS
BEGIN
  Declare @failed int

  Select @failed = Sum(Cast(passedSemester1 AS Int))
  From   CourseSummarry cs
         INNER JOIN Students st ON cs.userId = st.userId
  WHERE  @teacherId

  If @failed = 0 Then
    EXEC AllTeachersStudentsPassedSemester1 @teacherId
  End If
END;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM