SQL 替代not in

--纯收文办结的
SET STATISTICS TIME ON
go
select * from dbo.GWGL_PuTongShouWen where LiuZhuanZhuangTai=3 and uniqueid not in (select RHangBiaoShi from dbo.GWGL_FaWenXiangGuan where guanLianLeiXing=2 and RWenZhongBiaoShi=81 )
go
SET STATISTICS TIME OFF
go
--纯收文办结的
select * from GWGL_PuTongShouWen where LiuZhuanZhuangTai=3
EXCEPT  
select * from GWGL_PuTongShouWen where UniqueID in( select RHangBiaoShi from dbo.GWGL_FaWenXiangGuan where guanLianLeiXing=2 and RWenZhongBiaoShi=81)

### SQLNOT IN的用法与IN的区别 SQL中的 `NOT IN` 是一种用于排除某些值的操作符,它通过子查询或列表来指定需要排除的值。与 `IN` 操作符相反,`IN` 用于匹配列表或子查询中的任意一个值,而 `NOT IN` 则用于确保某个字段的值不在指定的列表或子查询结果中。 #### 1. NOT IN 的基本用法 `NOT IN` 的语法如下: ```sql SELECT column_name(s) FROM table_name WHERE column_name NOT IN (value1, value2, ...); ``` 或者通过子查询实现: ```sql SELECT column_name(s) FROM table_name WHERE column_name NOT IN (SELECT column_name FROM another_table); ``` 例如,假设有一个表 `a` 和一个表 `b`,需要从表 `a` 中选择那些 `id` 不在表 `b` 中的记录,可以使用以下语句[^1]: ```sql SELECT id FROM a WHERE id NOT IN (SELECT id FROM b); ``` #### 2. IN 的基本用法 `IN` 操作符用于检查某个值是否存在于一组值或子查询结果中。其语法与 `NOT IN` 类似,但逻辑相反: ```sql SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, ...); ``` 或者通过子查询实现: ```sql SELECT column_name(s) FROM table_name WHERE column_name IN (SELECT column_name FROM another_table); ``` 例如,从表 `a` 中选择那些 `id` 存在于表 `b` 中的记录,可以使用以下语句: ```sql SELECT id FROM a WHERE id IN (SELECT id FROM b); ``` #### 3. NOT ININ 的区别 - **逻辑方向**:`IN` 表示“包含”,即字段的值在指定的集合中;`NOT IN` 表示“不包含”,即字段的值不在指定的集合中。 - **处理空值(NULL)**:`NOT IN` 在子查询返回的结果中包含 `NULL` 时会失效,因为 `NULL` 的存在会导致条件始终为假。例如,如果子查询 `(SELECT id FROM b)` 返回了 `NULL`,那么 `id NOT IN (SELECT id FROM b)` 的结果将永远为假[^1]。 - **性能差异**:`NOT IN` 的性能通常较差,特别是在子查询返回大量数据时。为了优化,可以使用 `LEFT JOIN` 和 `IS NULL` 的组合替代 `NOT IN`。 #### 4. 替代 NOT IN 的方法 为了避免 `NOT IN` 在遇到 `NULL` 值时的问题,可以使用 `LEFT JOIN` 和 `IS NULL` 的方式来实现相同的功能。例如: ```sql SELECT a.id FROM a LEFT JOIN b ON a.id = b.id WHERE b.id IS NULL; ``` 这种方法可以有效避免 `NULL` 值带来的问题,并且在某些情况下性能更优。 #### 5. 示例对比 以下是 `IN` 和 `NOT IN` 的简单对比示例: - 使用 `IN`: ```sql SELECT name FROM employees WHERE department_id IN (1, 2, 3); ``` 此查询将返回所有 `department_id` 为 1、2 或 3 的员工。 - 使用 `NOT IN`: ```sql SELECT name FROM employees WHERE department_id NOT IN (1, 2, 3); ``` 此查询将返回所有 `department_id` 不为 1、2 或 3 的员工。 #### 6. 注意事项 当使用 `NOT IN` 时,必须确保子查询的结果中没有 `NULL` 值。否则,查询可能会返回意外的结果。可以通过过滤掉 `NULL` 值来解决这个问题: ```sql SELECT id FROM a WHERE id NOT IN (SELECT id FROM b WHERE id IS NOT NULL); ``` 此外,还可以使用 `NOT EXISTS` 来替代 `NOT IN`,以避免 `NULL` 值的影响: ```sql SELECT id FROM a WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.id = a.id); ``` ### 总结 `NOT IN` 是一种强大的操作符,但在实际使用中需要注意子查询返回的 `NULL` 值可能导致逻辑错误。推荐在复杂场景下使用 `LEFT JOIN` 或 `NOT EXISTS` 作为替代方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值