Sql server 2008 如何查询Sql数据库以获取学生';仅限完成所有考试的学生的成绩';s阶段

Sql server 2008 如何查询Sql数据库以获取学生';仅限完成所有考试的学生的成绩';s阶段,sql-server-2008,Sql Server 2008,examstagestbl CourseId StageId 1 1 1 2 2 1 3 1 3 2 3 3 3 4 StudentId CourseId StageId StageDgree 23 1 1 30 23 1 2 25

examstagestbl

 CourseId  StageId
 1         1
 1         2 
 2         1 
 3         1 
 3         2 
 3         3 
 3         4
StudentId   CourseId   StageId   StageDgree 
23          1          1          30 
23          1          2          25 
23          3          1          30 
10          1          1          27 
10          2          1          30
studentsresultbl

 CourseId  StageId
 1         1
 1         2 
 2         1 
 3         1 
 3         2 
 3         3 
 3         4
StudentId   CourseId   StageId   StageDgree 
23          1          1          30 
23          1          2          25 
23          3          1          30 
10          1          1          27 
10          2          1          30
请了解如何从表
studentsresultbl
中获取所有记录,这些记录仅适用于完成所有考试阶段的学生。 情景: 从上表中可以看出: 23号学生参加了课程1和3的考试,但他只完成了课程1。 10号学生参加了课程1和2的考试,但他只完成了课程2。 因此,如何使用SQL语句获得结果(如果学生在所有课程阶段都有考试),请尝试以下方法:

DECLARE @courses TABLE
    (
      CourseID INT ,
      StageID INT
    )
DECLARE @results TABLE
    (
      StudentID INT ,
      CourseID INT ,
      StageID INT
    )

INSERT  INTO @courses
VALUES  ( 1, 1 ),
        ( 1, 2 ),
        ( 2, 1 ),
        ( 3, 1 ),
        ( 3, 2 ),
        ( 3, 3 ),
        ( 3, 4 )

INSERT  INTO @results
VALUES  ( 23, 1, 1 ),
        ( 23, 1, 2 ),
        ( 23, 3, 1 ),
        ( 10, 1, 1 ),
        ( 10, 2, 1 );

WITH    cte1
          AS ( SELECT   CourseID ,
                        COUNT(*) AS StageCount
               FROM     @courses c
               GROUP BY CourseID
             ),
        cte2
          AS ( SELECT   StudentID ,
                        CourseID ,
                        COUNT(DISTINCT StageID) AS StageCount
               FROM     @results c
               GROUP BY StudentID ,
                        CourseID
             )
    SELECT  cte2.StudentID ,
            cte2.CourseID
    FROM    cte2
            JOIN cte1 ON cte1.CourseID = cte2.CourseID
    WHERE   cte1.StageCount = cte2.StageCount
    ORDER BY cte2.StudentID ,
             cte2.CourseID
输出:

StudentID   CourseID
10          2
23          1

你想让那些至少完成了一门课程和所有阶段的学生,还是完成了所有课程和所有阶段的学生?如果学生完成了课程中所有考试的阶段,我需要显示所有课程的结果。e、 g:学生23完成课程1的所有阶段,但不完成课程3,学生10只完成课程2