来自我的触发器SQL中的子查询的奇怪结果

时间:2015-03-10 20:22:44

标签: sql oracle triggers subquery

您好请考虑以下表格

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?

1 个答案:

答案 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(您错误地在内部查询中),它会过滤掉成功的连接 - 只留下缺少的必备课程。