MS Access:具有多个条件的双循环查询以显示在表单上
MS Access: double loop query with multiple conditions to display on Form
让我们试着用正确的措辞来表达,这里是我的相关 tables 的摘要:
- Table“学生”包含student_id、first_name、last_name.
- Table“课程”包含course_id,标题。
- Table“专业”包含major_id、major_name.
学生被分配到专业,课程被分配到专业(即获得特定专业所需的课程),因此,我有以下两个table定义分配哪些学生和课程哪个专业。
- Table "students_assigned_majors" 包含 ref_id (PK), student_id (FK), major_id (FK).
- Table "courses_assigned_majors" 包含 ref_id (PK), course_id (FK), major_id (FK).
最后,我把这个 table 称为
6. “completed_courses” 包含关于哪些学生完成了哪些课程的信息,列为 ref_id (PK)、student_id (FK)、course_id (FK)、completion_date.
我想创建一个查询来检查哪些学生没有资格从专业毕业,因为他们错过了专业要求的课程。超过 5 年完成的任何课程均无效。
我想在现有表格上显示这些学生及其专业。
我不确定这是否可以完全在 MS Access 中完成 SQL...我在相关表格的 On_current 事件上起草了一个 VBA 程序,现在它看起来像这样:(仍然 Pseudo-code 未测试,但这是想法)
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
我正在寻找有关实现此目标的最佳方法的一般性建议,如果根据您的经验,这个起草的解决方案值得花时间来完成,或者我是否完全偏离了轨道。
更具体地说,如果这是要走的路,还有一些不确定因素是:
- 我在哪里存储这个子程序?存入表单的当前事件中可以吗?
- 不符合要求的学生的值应该存放在哪里?稍后我想在表单上显示?
感谢您的帮助,希望提供一个有趣的挑战。
此致
考虑此查询以查找尚未完成相关专业要求的课程的学生:
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#));
让我们试着用正确的措辞来表达,这里是我的相关 tables 的摘要:
- Table“学生”包含student_id、first_name、last_name.
- Table“课程”包含course_id,标题。
- Table“专业”包含major_id、major_name.
学生被分配到专业,课程被分配到专业(即获得特定专业所需的课程),因此,我有以下两个table定义分配哪些学生和课程哪个专业。
- Table "students_assigned_majors" 包含 ref_id (PK), student_id (FK), major_id (FK).
- Table "courses_assigned_majors" 包含 ref_id (PK), course_id (FK), major_id (FK).
最后,我把这个 table 称为 6. “completed_courses” 包含关于哪些学生完成了哪些课程的信息,列为 ref_id (PK)、student_id (FK)、course_id (FK)、completion_date.
我想创建一个查询来检查哪些学生没有资格从专业毕业,因为他们错过了专业要求的课程。超过 5 年完成的任何课程均无效。
我想在现有表格上显示这些学生及其专业。
我不确定这是否可以完全在 MS Access 中完成 SQL...我在相关表格的 On_current 事件上起草了一个 VBA 程序,现在它看起来像这样:(仍然 Pseudo-code 未测试,但这是想法)
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
我正在寻找有关实现此目标的最佳方法的一般性建议,如果根据您的经验,这个起草的解决方案值得花时间来完成,或者我是否完全偏离了轨道。
更具体地说,如果这是要走的路,还有一些不确定因素是:
- 我在哪里存储这个子程序?存入表单的当前事件中可以吗?
- 不符合要求的学生的值应该存放在哪里?稍后我想在表单上显示?
感谢您的帮助,希望提供一个有趣的挑战。 此致
考虑此查询以查找尚未完成相关专业要求的课程的学生:
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#));