您好,请考虑下表
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 LAN002code是特定课程的代码,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(换句话说,如果学生没有通过先决条件,则为false )。
但是它是= 2。谁能给我解释一下这是为什么,以及如何使它= 0?
发布于 2015-03-11 06:06:01
它是2,因为您正在做一个左连接,它总是成功的,没有任何过滤。
要计算未通过的prereq课程的数量,请尝试执行以下操作:
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 (您在内部查询中错误地使用了它),它会过滤掉成功的连接,只留下缺少的必备课程。
https://stackoverflow.com/questions/28973383
复制相似问题