0
UPDATE student as s
LEFT JOIN takes as t ON s.ID = t.ID
LEFT JOIN course as c ON t.course_id = c.course_id
SET s.tot_cred = s.tot_cred - COALESCE(c.credits, 0)
WHERE t.grade = 'F'
OR
t.grade IS NULL

学生が失敗したクラスのクレジット値を差し引いて、学生の tot_cred を更新しようとしています。

上記のクエリは、'takes' リレーションの単一の 'F' グレードに対して機能します。ただし、成績列の「取得」関係の 4 つの NULL 値の 1 つに対してのみ機能します。

SQL にはかなり慣れていないので、クエリ内の何かが最初の NULL 値のみを探しており、それらのすべてではないと感じています。

テーブル:

mysql> select ID, tot_cred
    -> from student;
+-------+----------+
| ID    | tot_cred |
+-------+----------+
| 00128 |      102 |
| 12345 |       32 |
| 19991 |       80 |
| 23121 |      110 |
| 44553 |       56 |
| 45678 |       38 |
| 54321 |       54 |
| 55739 |       38 |
| 70557 |        0 |
| 76543 |       58 |
| 76653 |       60 |
| 98765 |       98 |
| 98988 |      112 |
+-------+----------+

対応するグレードがFまたはNULLの場合、ここでtot_credを変更したい

mysql> select ID, course_id, grade
    -> from takes
    -> order by grade;
+-------+-----------+-------+
| ID    | course_id | grade |
+-------+-----------+-------+
| 76543 | CS-001    | NULL  |
| 54321 | CS-001    | NULL  |
| 12345 | CS-001    | NULL  |
| 98988 | BIO-301   | NULL  |
| 98988 | BIO-101   | A     |
| 76543 | CS-319    | A     |
| 76543 | CS-101    | A     |
| 00128 | CS-101    | A     |
| 12345 | CS-190    | A     |
| 12345 | CS-315    | A     |
| 54321 | CS-101    | A-    |
| 55739 | MU-199    | A-    |
| 45678 | CS-319    | B     |
| 19991 | HIS-351   | B     |
| 98765 | CS-315    | B     |
| 45678 | CS-101    | B+    |
| 54321 | CS-190    | B+    |
| 44553 | PHY-101   | B-    |
| 12345 | CS-101    | C     |
| 76653 | EE-181    | C     |
| 23121 | FIN-201   | C+    |
| 98765 | CS-101    | C-    |
| 45678 | CS-101    | F     |
+-------+-----------+-------+

グレードはこちらです。4 つの NULL 値と 1 つの F があります。

mysql> select course_id, credits
    -> from course;
+-----------+---------+
| course_id | credits |
+-----------+---------+
| BIO-101   |       4 |
| BIO-301   |       4 |
| CS-101    |       4 |
| CS-190    |       4 |
| CS-315    |       3 |
| CS-319    |       3 |
| CS-347    |       3 |
| EE-181    |       3 |
| FIN-201   |       3 |
| HIS-351   |       3 |
| MU-199    |       3 |
| PHY-101   |       4 |
+-----------+---------+

ここからクレジット数を取得します。

NULL 値の 3 つがラボの前の質問からのものであることに気付きました。これらのエントリはコース関係では表されません。私の問題は解決しました。無駄な時間を過ごしてしまい、大変申し訳ありません。

4

3 に答える 3

0

NULL値のうち3つがコース関係で表されていないことに気づきませんでした。このクエリは問題なく機能します。時間を無駄にして申し訳ありません。

于 2013-03-04T07:42:58.033 に答える
0

これに変更してみてください:

UPDATE student as s
INNER JOIN takes as t ON s.ID = t.ID 
INNER JOIN course as c ON t.course_id = c.course_id
SET s.tot_cred = s.tot_cred - COALESCE(c.credits, 0)
WHERE t.grade = 'F'
OR
t.grade IS NULL
于 2013-03-04T07:16:29.143 に答える
0

LEFT JOIN の代わりに INNER JOIN に置き換える場合は、一致するレコードのみを更新する必要がある場合にチェックします。

UPDATE student s
LEFT JOIN takes as t ON s.ID = t.ID and t.grade = 'F' OR t.grade is NULL
LEFT JOIN course as c ON t.course_id = c.course_id
SET tot_cred = tot_cred - COALESCE(c.credits, 0);

ここでフィドルを確認してください

于 2013-03-04T07:22:16.063 に答える