您好请考虑以下表格
PassedCourses
:
id code credits
----------------------
frosto CON002 10
oskjone CON002 10
tegman CON002 10
oskjon LAN001 10
oskjon TDA300 10
oskjon TDA357 8
oskjone TDA357 8
oskjon TDA400 8
oskjon TDA416 10
和
Prerequisites
:
code prereq
---------------
TDA301 TDA300
TDA301 TDA357
CON001 CON002
LAN003 LAN002
代码是特定课程的代码,prereq是预先编写的课程代码。在触发器中,我希望能够创建变量
stdhasntprereq INT
现在考虑以下子查询
SELECT COUNT(*)
INTO StdHasntPrereq
FROM
(SELECT *
FROM Prerequisites Pr
WHERE :newLine.code = Pr.code) Prere
LEFT JOIN
PassedCourses P ON P.cid = :newline.cid
AND Prere.prereq = P.code
AND P.code IS NULL;
现在如果我要插入这个学生,触发器将激活
insert into REGISTRATIONS (CID, CODE, STATUS)
values ('oskjon', 'TDA301', 'Registered');
最后针对这个问题:在我的计算中,上面的子查询应该不给我任何行,因此Stdhasntprereq
应该是= 0(换句话说,如果学生没有通过先决条件,那将是错误的)。
然而它是= 2.有人可以向我解释为什么会这样,以及如何使它= 0?
答案 0 :(得分:0)
它是2,因为你正在进行LEFT JOIN,它总是成功,没有任何过滤。
要计算未传递的先决条件课程的数量,请尝试以下方法:
SELECT COUNT(*)
INTO StdHasntPrereq
FROM Prerequisites r
LEFT JOIN PassedCourses p ON p.code = r.code
WHERE r.code = :newLine.code
AND p.code IS NULL
请注意where子句条件p.code IS NULL
(您错误地在内部查询中),它会过滤掉成功的连接 - 只留下缺少的必备课程。