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學生已經失敗,品位在發生關係=「F」,或正在服用,等級中取IS NULL。IS NULL沒有找到所有的空值列MYSQL
以上查詢適用於'take'關係中的單個'F'級別。然而,它只適用於成績列中'take'關係中的4個NULL值之一。
對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 |
+-------+----------+
我想改變這裏的tot_cred如果相應的等級爲F或NULL
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 |
+-----------+---------+
這是我從中得到的學分數。
剛剛意識到3個NULL值來自實驗室中的上一個問題。這些條目沒有在課程關係中表示。我的問題解決了。我爲所有的浪費時間感到非常抱歉。如果你想有內更換JOIN代替LEFT JOIN,你可能只想更新這些記錄其作爲匹配的記錄
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
我添加了3個用於查詢的表格 – 2013-03-04 07:29:18
您應該將答案標記爲已接受,而不是將「已解決」添加到問題標題。 – 2013-03-04 08:52:37