[以前的论文题目问题]
我有一个场景,我有一个父表和一个子表.子表具有父表的外键.当子表行中的列具有特定值时,我需要更新父表的状态列.每个父母都有多个子记录,在某些情况下没有.是否可以使用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记录应从查询中排除.
总重写
这是一个完整的重写,以使我的例子符合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.
所以教学是:一盎司的测试值得十六吨的假设.
| 归档时间: |
|
| 查看次数: |
29995 次 |
| 最近记录: |