Oracle SQL:根据另一个表中的值有条件地更新表

Wal*_*ker 3 sql oracle plsql

[以前的论文题目问题]

Oracle SQL:如果所有子表行在列中都具有特定值,则更新父表列.仅更新所有科目中有100分的学生的RANK.如果学生在任何科目中的分数少于100分,则不应更新他的分数.

我有一个场景,我有一个父表和一个子表.子表具有父表的外键.当子表行中的列具有特定值时,我需要更新父表的状态列.每个父母都有多个子记录,在某些情况下没有.是否可以使用Oracle SQL实现此目的,而无需使用PL/SQL.这可能吗,有人可以解释一下吗?在某些情况下,我必须根据两列子表记录更新父表行的列.

我确切的问题是:我有两个表学生,MARKS.MARKS有一个名为STUDENT_ID的学生FK.MARKS具有STUDENT记录的行数,具体取决于不同的科目(MARKS有一个FK到SUBJECTS),并有一个名为MARKS_OBTAINED的列.我必须检查如果每个主题的一个学生的MARKS_OBTAINED(即他在MARKS中的所有记录)的值为100,那么将STUDENT表的列RANK更新为值'Merit'.这个查询:

update STUDENT
      set RANK = 'Merit'
      where   exists ( select *
                         from MARKS
                        where MARKS.STUDENT_ID = STUDENT.ID
                          and MARKS.MARKS_OBTAINED  = 100)
      and not exists ( select *
                         from MARKS
                        where MARKS.STUDENT_ID = STUDENT.ID
                          and MARKS.MARKS_OBTAINED != 100)
Run Code Online (Sandbox Code Playgroud)

更新所有在任何科目中有100分的学生.它不排除非100标记的记录.因为它在MARKS中为STUDENT传递行,其中MARKS中的一个记录有100个MARKS_OBTAINED但其他记录少于100个标记,但由于STUDENT在一个主题中获得了100个标记,因此其RANK也将更新.要求是,如果任何STUDENT记录在MARKS_OBTAINED列中具有非100值的MARKS记录,则此STUDENT记录应从查询中排除.

APC*_*APC 6

总重写

这是一个完整的重写,以使我的例子符合OQ的修订问题.不幸的是,Manish实际上没有运行我的原始解决方案,否则他们会意识到以下断言是错误的:

您的解决方案将返回所有在任何科目中有100分的学生.它不排除非100标记的记录.

这里有六名学生和他们的分数.

SQL> select * from student
  2  /

        ID RANK
---------- ----------
         1 normal
         2 normal
         3 normal
         4 normal
         5 normal
         6 normal

6 rows selected.

SQL> select * from marks
  2  /

 COURSE_ID STUDENT_ID       MARK
---------- ---------- ----------
         1          1        100
         2          1        100
         1          2        100
         2          2         99
         1          4        100
         2          5         99
         1          6         56
         2          6         99

8 rows selected.

SQL>
Run Code Online (Sandbox Code Playgroud)

学生#1有两门课程,分数为100.学生#4只有一门课程但标记为100.学生#2在一门课程中有100分,但在另一门课程中只有99分.其他学生在任何课程中都没有得分100分.哪些学生将获得"优点?

SQL> update student s
  2      set s.rank = 'merit'
  3      where exists ( select null
  4                     from marks m
  5                     where m.student_id = s.id
  6                     and m.mark = 100 )
  7      and not exists ( select null
  8                       from marks m
  9                       where m.student_id = s.id
 10                       and m.mark != 100)
 11  /

2 rows updated.

SQL>
SQL> select * from student
  2  /

        ID RANK
---------- ----------
         1 merit
         2 normal
         3 normal
         4 merit
         5 normal
         6 normal

6 rows selected.

SQL>
Run Code Online (Sandbox Code Playgroud)

瞧!只有那些在所有课程中有100分的学生才得到更新.永远不要低估一个人的力量AND.

所以教学是:一盎司的测试值得十六吨的假设.