首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >触发器SQL中子查询的奇怪结果

触发器SQL中子查询的奇怪结果
EN

Stack Overflow用户
提问于 2015-03-11 04:22:44
回答 1查看 32关注 0票数 0

您好,请考虑下表

PassedCourses

代码语言:javascript
复制
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

代码语言:javascript
复制
code    prereq
---------------
TDA301  TDA300
TDA301  TDA357
CON001  CON002
LAN003  LAN002

code是特定课程的代码,prereq是必备课程的代码。在触发器中,我希望能够创建一个变量

代码语言:javascript
复制
stdhasntprereq INT 

现在考虑以下子查询

代码语言:javascript
复制
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;

现在,如果我插入这个学生,触发器将被激活

代码语言:javascript
复制
insert into REGISTRATIONS (CID, CODE, STATUS)
values ('oskjon', 'TDA301', 'Registered');

最后,对于问题:在我的计算中,上面的子查询应该没有给我提供任何行,因此Stdhasntprereq应该为=0(换句话说,如果学生没有通过先决条件,则为false )。

但是它是= 2。谁能给我解释一下这是为什么,以及如何使它= 0?

EN

回答 1

Stack Overflow用户

发布于 2015-03-11 06:06:01

它是2,因为您正在做一个左连接,它总是成功的,没有任何过滤。

要计算未通过的prereq课程的数量,请尝试执行以下操作:

代码语言:javascript
复制
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 (您在内部查询中错误地使用了它),它会过滤掉成功的连接,只留下缺少的必备课程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28973383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档