MS Access:具有多个条件的双循环查询以显示在表单上

Posted

技术标签:

【中文标题】MS Access:具有多个条件的双循环查询以显示在表单上【英文标题】:MS Access: double loop query with multiple conditions to display on Form 【发布时间】:2021-10-28 04:12:18 【问题描述】:

让我们试着正确表达一下,这里是我的相关表格的摘要:

    包含 student_id、first_name、last_name 的表“students”。 包含 course_id、title 的表“课程”。 包含major_id、major_name 的表“majors”。

学生被分配到专业,课程被分配到专业(即获得特定专业所需的课程),因此,我有以下两个表格来定义哪些学生和课程被分配到哪些专业。

    包含 ref_id (PK)、student_id (FK)、major_id (FK) 的表“students_assigned_majors”。 包含 ref_id (PK)、course_id (FK)、major_id (FK) 的表“courses_assigned_majors”。

最后,我有这张桌子叫 6. “completed_courses”包含哪些学生完成了哪些课程的信息,列有 ref_id (PK)、student_id (FK)、course_id (FK)、completion_date。

我想创建一个查询来检查哪些学生没有资格从该专业毕业,因为他们错过了该专业要求的课程。任何课程如果完成时间超过 5 年,则无效。

我想在现有表单上显示这些学生及其专业。

我不确定这是否可以完全在 MS Access SQL 中完成......我在相关表单的 On_current 事件上起草了一个 VBA 过程,现在它看起来像这样:(仍然没有测试伪代码,但是这是想法)

Private Sub Form_Current(major_parameter as String)
    Dim Sql_cour As String
    Dim Sql_stud As String
    
    Dim db As Database
    Dim rs_courses As DAO.Recordset
    Dim rs_students As DAO.Recordset
    
    Set Sql_cour = "SELECT course_id FROM courses_assigned_major WHERE major_id = major_parameter;"
                
    Set Sql_stud = "SELECT student_id, first_name, last_name FROM students_assigned_majors as SAM  LEFT OUTER JOIN students as S on (SAM.student_id = S.student_id) WHERE SAM.major_id = major_parameter;"

    Set rs_courses = db.OpenRecordset(Sql_cour)
    Set rs_students = db.OpenRecordset(Sql_stud)
    
    Do While Not rs_students.EOF
        Do While Not rs_courses.EOF
            'check completed_courses table for student_id, course_id, date of course < 5 years ago

            'If conditions not met
                'Add student to new query/table "not_eligible"
                Exit inner Loop
            rs_courses.MoveNext
        Loop
        rs_students.MoveNext
    Loop
End Sub

我正在寻找有关实现此目标的最佳方法的一般建议,如果根据您的经验,这个草拟的解决方案值得投入时间来完成,或者如果我完全偏离轨道。

更具体地说,如果这是要走的路,还有一些不确定性是:

    我在哪里存储这个子程序?将其存储在表单的当前事件中是否可以? 不符合要求的学生的价值观存放在哪里?以后我想在表单上显示哪个?

感谢您的帮助,希望能提供一个有趣的挑战。 问候

【问题讨论】:

1.你试过这个代码吗?使用参数构建 Current 事件过程是没有意义的,无论如何它都会出错。将代码放在通用模块中的自己的过程中。可能需要一个返回从查询调用的 True/False 值的函数。 2. 通常情况下,你不会。构建查询并在表单或列表框中显示其结果。另一种方法是将数据保存到“临时”表中。 确实应该提供示例数据和所需的输出作为文本表。建议不要在多个表中使用完全相同的字段名称。考虑类似:student_id_fk_CC、student_id_fk_CAM、student_id_fk_SAM。 【参考方案1】:

考虑这个查询来查找没有完成相关专业要求的课程的学生:

SELECT stud_maj_courses.student_id, stud_maj_courses.major_id_fk_SAM, stud_maj_courses.course_id_fk_CAM
FROM (
     (SELECT students.student_id, students_assigned_majors.major_id_fk_SAM, courses_assigned_majors.course_id_fk_CAM
      FROM (students INNER JOIN students_assigned_majors ON students.student_id = students_assigned_majors.student_id_fk_SAM) 
      INNER JOIN courses_assigned_majors ON students_assigned_majors.major_id_fk_SAM = courses_assigned_majors.major_id_fk_CAM) 
   AS stud_maj_courses 
INNER JOIN students ON stud_maj_courses.student_id = students.student_id) 
LEFT JOIN completed_courses ON (stud_maj_courses.course_id_fk_CAM = completed_courses.course_id_fk_CC) 
AND (stud_maj_courses.student_id = completed_courses.student_id_fk_CC)
WHERE (((completed_courses.student_id_fk_CC) Is Null)) OR (((completed_courses.completion_date)<#5/31/2016#));

【讨论】:

非常感谢您的支持!更清洁的解决方案肯定会提高 mi SQL 技能 :) 只是为了其他人,在第 4 行发现一个错误,它应该是“ON students.student_id = students_assigned_majors.student_id_fk_SAM)”。干杯 糟糕,不知道这是怎么回事。编辑答案。

以上是关于MS Access:具有多个条件的双循环查询以显示在表单上的主要内容,如果未能解决你的问题,请参考以下文章

查询不使用 MS-Access 中的日期条件进行拉取

具有用户功能条件的 MS Access 查询停止处理 odbc 数据

查询 MS Access 多个条件(where)

将 12 个具有不同“where”条件的 MS Access 查询组合到一个查询中

MS Access:查询以添加“如果”条件

MS Access 03 - 更新查询条件的一个字段中有多个“ifs”?