sql - Oracle“NOT IN”没有返回正确的结果?
问题描述
NOT IN
我正在使用函数比较两个在彼此之间共享唯一值的表,Oracle
但我得到了
select count(distinct CHARGING_ID) from BILLINGDB201908 where CDR_TYPE='GPRSO'
输出为:521254
对于所有计费 ID --< 这是 BILLINGDB201908 中的唯一计费 ID 总数
现在我想在表 BILLINGDB201908 中找到也存在于表 CBS_CHRG_ID_AUG 中的 id
select count(distinct CHARGING_ID) from BILLINGDB201908 where CDR_TYPE='GPRSO'
AND charging_id IN (select CHARGINGID from CBS_CHRG_ID_AUG);
--- 结果315567
回扣 ID 存在 BILLINGDB201908 也存在于 CBS_CHRG_ID_AUG
现在我想找到 CBS_CHRG_ID_AUG 中不存在但存在 BILLINGDB201908 的计费 ID
select count(distinct CHARGING_ID) from prmdb.CDR_TAPIN_201908@prmdb where CDR_TYPE='GPRSO'
AND charging_id NOT IN (select CHARGINGID from CBS_CHRG_ID_AUG);
——结果回来了0
!?我应该得到205687
正是因为521254-315567
= 205687 ?
解决方案
NOT IN
如果子查询中的任何值是 ,则不返回任何行NULL
。因此,我强烈推荐NOT EXISTS
:
SELECT count(distinct CHARGING_ID)
FROM prmdb.CDR_TAPIN_201908@prmdb ct
WHERE CDR_TYPE = 'GPRSO' AND
NOT EXISTS (SELECT 1
FROM CBS_CHRG_ID_AUG ccia
WHERE ccia.charging_id = ct.charging_id
);
我还建议将您的第一个查询更改为EXISTS
. 事实上,只要不使用子查询IN
和NOT IN
,就不会出现这个问题。
推荐阅读
- java - 做while循环语法错误,程序没有遍历所有代码,代码效率
- flask - Google Cloud Functions - 测试/模拟 HTTP 触发函数的身份验证?
- python - 从第一页删除页眉和页脚
- memory-management - get_user_pages() 如何在 Linux 中固定进程页面?
- angular - (Jasmine)如何生成和刷新错误代码为 406 并且还包含 error.error.error 的模拟错误?
- javascript - PHP 表单发送电子邮件但 $_POST['email'] 失败
- json - 将大对象数组发送到spring boot控制器并将数据保存在数据库中
- html - 如何使用 css 恢复溢出滚动行为
- java - 如何处理域类(Java)中的依赖异步操作?
- c# - 将变量传递给函数和列表传递给函数之间的性能差异