我有3个课程,成绩和评估.我想比较两个表等级和评估.如果表评估中不存在表级中的数据,则会出现数据(输出)
" select Grade.ID_Courses,Course.ID_Courses,Grade.NAME,
Course.NAME, Grade.ID_Courses,
Evaluation.NAME,
Evaluation.Year,
Grade.Year
from Grade, Course, Evaluation
WHERE
Grade.ID_Courses=Course.ID_Courses AND
Grade.NAME=JOHN and
Grade.Year=1 and
Evaluation.NAME=GRADE.NAME and
Grade.ID_Courses NOT IN (SELECT ID_Courses FROM Evaluation where NAME=JOHN and Year=1 )
GROUP BY Grade.ID_Courses"
解决方法:
如果是的话,避免像瘟疫一样
SELECT ID_Courses FROM Evaluation where `NAME`='JOHN' and Year=1
可以包含NULL.相反,使用NOT EXISTS或Left Joins
使用显式连接,而不是使用WHERE子句的1980年代样式连接
为了说明NOT IN的痛苦:
sql NOT IN()危险
create table mStatus
( id int auto_increment primary key,
status varchar(10) not null
);
insert mStatus (status) values ('single'),('married'),('divorced'),('widow');
create table people
( id int auto_increment primary key,
fullName varchar(100) not null,
status varchar(10) null
);
Chunk1:
truncate table people;
insert people (fullName,`status`) values ('John Henry','single');
select * from mstatus where `status` not in (select status from people);
** 3行,如预期**
Chunk2:
truncate table people;
insert people (fullName,`status`) values ('John Henry','single'),('Kim Billings',null);
select * from mstatus where status not in (select status from people);
没有行,对吧?
显然这是’不正确’.它源于sql使用三值逻辑,
由NULL的存在驱动,一个非值表示丢失(或UNKNowN)信息.
使用NOT IN,Chunk2它的翻译如下:
status NOT IN ('married', 'divorced', 'widowed', NULL)
这相当于:
NOT(status='single' OR status='married' OR status='widowed' OR status=NULL)
表达式“status = NULL”的计算结果为UNKNowN,根据三值逻辑的规则,
NOT UNKNowN也评估为UNKNowN.结果,所有行都被过滤掉,查询返回一个空集.
可能的方案包括:
select s.status
from mstatus s
left join people p
on p.status=s.status
where p.status is null
或使用不存在
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。