【DB2】NOT IN使用中的大坑

本文通过创建两个表并插入数据,对比了IN、EXISTS、NOT IN和NOT EXISTS等SQL查询方式的效果,特别指出NOT IN在遇到NULL值时可能出现的问题。

1.环境准备

------建表TB
DROP TABLE TB;

CREATE TABLE TB
    (
    ID           INTEGER,
    LEVEL_DETAIL VARCHAR (100)
    );
INSERT INTO TB (ID, LEVEL_DETAIL)
VALUES (1, 'A');

INSERT INTO TB (ID, LEVEL_DETAIL)
VALUES (NULL, 'A');

INSERT INTO TB (ID, LEVEL_DETAIL)
VALUES (2, 'B');

INSERT INTO TB (ID, LEVEL_DETAIL)
VALUES (1, 'A++');

INSERT INTO TB (ID, LEVEL_DETAIL)
VALUES (1, 'A--');
----建表TB_TEMP
DROP TABLE TB_TEMP;

CREATE TABLE TB_TEMP
    (
    ID           INTEGER,
    LEVEL_DETAIL VARCHAR (100)
    );

INSERT INTO TB_TEMP (ID, LEVEL_DETAIL)
VALUES (1, 'A');

INSERT INTO TB_TEMP (ID, LEVEL_DETAIL)
VALUES (2, 'B');

INSERT INTO TB_TEMP (ID, LEVEL_DETAIL)
VALUES (1, 'A++');

INSERT INTO TB_TEMP (ID, LEVEL_DETAIL)
VALUES (1, 'A--');

INSERT INTO TB_TEMP (ID, LEVEL_DETAIL)
VALUES (3, 'CCC');

INSERT INTO TB_TEMP (ID, LEVEL_DETAIL)
VALUES (4, 'CCC');

INSERT INTO TB_TEMP (ID, LEVEL_DETAIL)
VALUES (4, 'C');

INSERT INTO TB_TEMP (ID, LEVEL_DETAIL)
VALUES (5, 'AA');

数据展示:

TB表

image

TB_TEMP表

image

---使用IN
SELECT * FROM TB_TEMP WHERE ID IN (SELECT ID FROM TB GROUP BY ID)

image

 

--EXISTS
SELECT * FROM TB_TEMP A WHERE EXISTS (SELECT 1 FROM TB B WHERE A.ID=B.ID)

image

 

--NOT IN (跟预期结果不一致)
SELECT * FROM TB_TEMP WHERE ID NOT IN (SELECT ID FROM TB GROUP BY ID)

预期结果:

IDLEVEL_DETAIL
3CCC
4CCC
4C
5AA

实际结果:

image

--NOT EXISTS(没问题)
SELECT * FROM TB_TEMP A WHERE NOT EXISTS (SELECT 1 FROM TB B WHERE A.ID=B.ID)
image

在使用过程中,尽量不要使用NOT IN ,当列中出现了NULL值,那么将会无结果返回(NULL不是具体的值,做二元运算符时,计算结果也为NULL)

转载于:https://www.cnblogs.com/OliverQin/p/6735324.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值