注意null值对not in的影响


create table party(
code varchar(10) primary key not null,
name varchar(10),
leader varchar(50)
);

create table msp(
m_name varchar(50) primary key not null,
code varchar(10) ,
constraint pa_fk foreign key(code)
references party(code),
con varchar(50)
);

insert into party(code,name,leader) values(1001,'党1','老胡');
insert into party(code,name,leader) values(1002,'党2','老马');
insert into party(code,name,leader) values(1003,'党3','老李');

insert into msp(m_name,code,con) values('a',1001,'河北');
insert into msp(m_name,code,con) values('b',1001,'山东');
insert into msp(m_name,code,con) values('c',1002,'河北');
insert into msp(m_name,con) values('d','陕西');

select * from party;
返回:
code name leader
1001 党1 老胡
1002 党2 老马
1003 党3 老李

select * from msp;
返回:
m_name  code con
a 1001 河北
b 1001 山东
c 1002 河北
d NULL 陕西

下面的代码返回几行记录?
select * from msp
where code not in (select code from party);
一般都会以为返回1行记录,其实不会返回任何记录,原因是因为null不能直接比较。
可能not in内部采用的算法就是比较。
同时在SQLserver和Oracle测试,都不会返回任何记录。

解决:将null转换为一个不为空的值。
select * from msp
where isnull(code,-1) not in (select code from party);

注意:-1只要不是party表中code的值就可以。用-1的原因是因为一般编号不可能用负值。

用not exists进行对比:
select * from msp
where  not exists (select code from party where party.code = msp.code);
由于null无法匹配,所以子查询返回0行记录,满足条件,可以查到。
m_name code con
d      null 陕西

从理论上讲,查询不在另一个表存在的编号时,not exists最快,而且也不受NULL值影响,所以在项目要尽可能多的使用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值