我有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" 问题是当表中没有名称john时,则没有输出。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
避免NOT IN像瘟疫一样
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 ); 块1:
truncate table people; insert people (fullName,status
) values ('John Henry','single'); select * from mstatus where status
not in (select status from people); ** 3行,符合预期**
块2:
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的存在驱动,而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 或使用 not exists来源:stack overflow