【问题标题】:SQL column values must exist in both tablesSQL 列值必须存在于两个表中
【发布时间】:2017-05-12 16:26:33
【问题描述】:

我想获取 ID 为 444111110 的学生可以注册的课程。 可以注册的课程是没有先决条件的课程或有 先决条件,他已经参加并取得了成绩。

课程也必须显示学生退学,以便他可以重新注册。它将在等级栏中给出“W” 不得显示学生修读的课程和他修读的课程。 如果他已经在学习这门课程,它将在成绩栏中显示“U”。

#COURSE_ID   PREREQUISITE_COURSE_ID
CS111        NULL
CS211        CS111
CS244        CS311
CS244        CS211
CS244        CS111
CS311        CS211
CS311        CS111

# STUDENT_ID  COURSE_ID  DATEREGISTERED  EnrollToken  GREADE
444111110     CS111      2005-03-10      5            A
444111110     CS211      2005-03-10      7            A+
444111111     CS111      2005-03-10      6            W

# COURSE_ID  COURSE_NAME           TERM  CREDITS_HOUR  SEATS_LEFT
CS111        Intro. to CS          1     3             50
CS211        Intro. to PS          2     3             50
CS244        Adcanced Application  4     3             50
CS311        Introduction to OOB   3     3             50

我试过这个查询 SELECT DISTINCT C.COURSE_ID, C.COURSE_NAME, C.SEATS_LEFT FROM ENROLLMENT E, PREREQUISITE P, COURSES C WHERE C.COURSE_ID NOT IN (SELECT COURSE_ID FROM ENROLLMENT WHERE STUDENT_ID = '444111110' AND GREADE !='U') AND P.PREREQUISITE_COURSE_ID IN (SELECT COURSE_ID FROM ENROLLMENT WHERE STUDENT_ID = '444111110' AND GREADE !='W'); 但它为 id 为 444111110 的学生返回 CS244 和 CS311,而它应该只返回 CS311。 对于没有注册任何课程或仅退出第一门课程即 CS111 的学生,它也不会返回任何内容。

有没有一种可能的方法来检查学生是否参加了所有的先修课程而不是其中的一部分? 有没有办法为没有参加任何课程的学生修复该查询,以向他们展示他们可以注册 CS111,其先决条件是 NULL?。

提前致谢。

【问题讨论】:

  • StackOverflow 不是为你做功课的地方。不过,看起来你最后可能有一个合理的问题。请对其进行编辑以更具体地说明您遇到的问题。您的帖子中有太多额外信息。
  • 嗯,这不是家庭作业,这是我自己解决的一个问题,以便更好地学习 SQL,我从头开始创建了这个数据库,以便将它与 Java 应用程序连接起来。你只是决定这是家庭作业,你甚至没有试图帮助。我用“太多额外信息”作为主题,以便专家可以判断数据库的设计是否糟糕,也便于谁回答我,因为他得到了表中的模式和数据会更清楚。无论如何,感谢您让我失望,我已经想出了解决方案并在有人需要时发布。

标签: mysql sql database


【解决方案1】:

,试试这个

select course_ID, COURSE_NAME, SEATS_LEFT from Courses
where course_ID in (select course_ID from Enrollment where grade ='W')
or course id in (select course_id from Prerequisites where prerequisite_course_id in (select course_ID from Enrollment where grade != 'W')

【讨论】:

    【解决方案2】:
    SELECT COURSE_ID,COURSE_NAME,SEATS_LEFT FROM Courses WHERE Course_ID NOT IN (
        SELECT Course_ID FROM prerequisite WHERE PREREQUISITE_COURSE_ID IN 
        (SELECT Course_ID FROM Courses WHERE Course_ID NOT IN 
        (SELECT Course_ID FROM Enrollment WHERE Student_ID = '444111110' AND GREADE NOT IN ('U', 'F', 'W') ) ) ) AND Course_ID NOT IN 
        (SELECT Course_ID FROM Enrollment WHERE Student_ID = '444111110' AND (GREADE = 'U' OR GREADE NOT IN ('F', 'W') )  );
    

    我要感谢我的导师为我解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 2022-12-22
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多