首页 > 解决方案 > 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 ?

标签: sqldatabaseoraclesubquery

解决方案


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. 事实上,只要不使用子查询INNOT IN,就不会出现这个问题。


推荐阅读